<StackPanel x:Name="stkWaitingPatients" Width="300" Margin="0,0,0,-3"
   DataContext="{Binding Mode=OneWay, Source={StaticResource local:oPatients}}">

Я получаю ссылку на StaticResource "local: oPatients" не найден.

Вот код:

    public partial class MainWindow : Window
{
    ListBox _activeListBox;
    clsPatients oPatients;

    public MainWindow()
    {
        oPatients = new clsPatients(true);

...
0
LSTayon 18 Авг 2009 в 21:42
Ваше имя пользователя отображается как «неизвестно», возможно, вы захотите отредактировать свой профиль пользователя.
 – 
Joel B Fant
18 Авг 2009 в 21:56
Когда я начал, он попросил мою учетную запись google или что-то в этом роде, и вот что произошло ... Я буду работать над этим! ;)
 – 
LSTayon
18 Авг 2009 в 22:04

3 ответа

Лучший ответ

Чтобы иметь возможность обращаться к объекту как к StaticResource, он должен быть в словаре ресурсов. Однако, поскольку вы создаете объект в конструкторе MainWindow, вы можете установить DataContext в коде программной части следующим образом.

oPatients = new clsPatients(true);
stkWaitingPatients.DataContext = oPatients;

А затем измените Binding на это:

{Binding Mode=OneWay}

Это нормальная практика, если вы не собираетесь снова менять DataContext, иначе вам понадобится более гибкое решение.

Изменить: вы упомянули ObjectDataProvider в своем комментарии. Вот как бы вы это сделали. Сначала добавьте xmlns:sys в Window для пространства имен System (я предполагаю, что он у вас уже есть для xmlns:local):

xmlns:sys="clr-namespace:System;assembly=mscorlib"

Затем вы можете добавить ObjectDataProvider в свой словарь ресурсов следующим образом:

<Window.Resources>
    <ObjectDataProvider
        x:Key="bindingPatients"
        ObjectType="{x:Type local:clsPatients}">
        <ObjectDataProvider.ConstructorParameters>
            <sys:Boolean>True</sys:Boolean>
        </ObjectDataProvider.ConstructorParameters>
    </ObjectDataProvider>
</Window.Resources>

И обратитесь к нему в Binding с разметкой StaticResource, как это, используя ту же строку, которую мы указали во вложенном свойстве x:Key, которое мы дали ему в словаре:

{Binding Source={StaticResouce bindingPatients}, Mode=OneWay}

Изменить 2: Хорошо, вы разместили в своем ответе дополнительный код, и теперь я знаю, почему он генерирует исключение во время конструктора. Вы пытаетесь сделать это ...

lstWaitingPatients.DataContext = oPatients;

... но lstWaitingPatients фактически не существует до тех пор, пока не завершится this.InitializeComponent(). InitializeComponent() загружает XAML и выполняет множество других действий. Если вам действительно не нужно что-то делать перед всем этим, поместите собственный код запуска после вызова InitalizeComponent() или в обработчике событий для Window Loaded мероприятие.

2
Joel B Fant 18 Авг 2009 в 23:10
Я просто пытаюсь переместить текст данных в код позади, чтобы я мог отловить ошибки (например, неправильную строку подключения), а затем перейти на удобную для пользователя страницу ошибок ... не мог понять, как это сделать, используя и ObjectDataSource в XAML ... Попробую сейчас ...
 – 
LSTayon
18 Авг 2009 в 22:05
Нет, я получаю общее сообщение «Невозможно создать экземпляр Window» ... могу я прислать вам еще код? Это сводит меня с ума!
 – 
LSTayon
18 Авг 2009 в 22:26
Это означает, что во время работы конструктора Window возникает исключение, вероятно, из-за ошибки в XAML. Отправка вам большего количества кода не поможет, но просмотр вашего кода поможет. Вы поместили xmlns:sys в тег Window? Был ли уже <Window.Resources>, а теперь их 2? Это может быть много чего.
 – 
Joel B Fant
18 Авг 2009 в 22:40
А какой пробовал? Назначение DataContext в коде программной части?
 – 
Joel B Fant
18 Авг 2009 в 22:41
Оу, я понял! А как насчет того, чтобы я поместил назначение DataContext ПОСЛЕ InitializeComponent ?! Спасибо!!!
 – 
LSTayon
18 Авг 2009 в 23:05

Следующее устанавливает ItemsSource в коде позади и правильно обрабатывает привязку данных:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        clsPatients oPatients = new clsPatients(true);

        //assuming oPatients implements IEnumerable
        this.lstWaitingPatients.ItemsSource = oPatients;

И XAML:

<ListBox x:Name="lstWaitingPatients"       
         IsSynchronizedWithCurrentItem="true"
         ItemTemplate="{StaticResource WaitingPatientsItemTemplate}"
         FontSize="21.333" Height="423.291"
         ScrollViewer.VerticalScrollBarVisibility="Visible"
         GotFocus="lstWaitingPatients_GotFocus"
         />
1
user7116 18 Авг 2009 в 23:09
Но я бы пошел с ObjectDataProvider из ответа @Joel.
 – 
user7116
18 Авг 2009 в 23:16

Теперь я не могу заставить это работать ... Я получаю общую ошибку запуска Windows.

Вот программный код с инициализатором и создаваемым классом:

    public partial class MainWindow : Window
{
    ListBox _activeListBox;

    public MainWindow()
    {
        clsPatients oPatients = new clsPatients(true);
        lstWaitingPatients.DataContext = oPatients;

        this.InitializeComponent();

Вот верхняя часть моего XAML:

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Orista_Charting"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" 
xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
x:Class="Orista_Charting.MainWindow"
x:Name="windowMain"
Title="Orista Chart"
Width="1024" Height="768" Topmost="True" WindowStartupLocation="CenterScreen" Activated="MainWindow_Activated" >


<Window.Resources>        

    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Resources/ButtonStyles.xaml"/>
            <ResourceDictionary Source="Resources/OtherResources.xaml"/>
            <ResourceDictionary Source="Resources/TextBlockStyles.xaml"/>
            <ResourceDictionary Source="Resources/Converters.xaml"/>
        </ResourceDictionary.MergedDictionaries>

Вот соответствующий XAML, как вы видите, я пошел дальше и переместил DataContext вниз в ListBox из StackPanel. Это не выполняется, но отображается в представлении «Дизайн» (однако данные отсутствуют в ListBox):

<!-- Waiting Patients List -->
    <Border BorderThickness="1,1,1,1" BorderBrush="#FF000000" Padding="10,10,10,10" 
            CornerRadius="10,10,10,10" Background="#FFFFFFFF" Margin="15.245,187.043,0,41.957" HorizontalAlignment="Left" >
        <StackPanel x:Name="stkWaitingPatients" Width="300" Margin="0,0,0,-3"> 

            <StackPanel Orientation="Horizontal">    
                <TextBlock Text="Waiting Patients:" VerticalAlignment="Center" FontSize="21.333" Margin="0,0,0,20"/>
                <TextBlock HorizontalAlignment="Right" Margin="0,0,38.245,0" Width="139" Height="16" 
                Text="Minutes Waiting" TextWrapping="Wrap" Foreground="#FF9C2525" FontWeight="Bold" VerticalAlignment="Bottom"
                TextAlignment="Right"/> 
                <!-- Too be implemented, this is the wait animation -->
                <!--<Image x:Name="PollGif" Visibility="{Binding Loading}"
                       HorizontalAlignment="Left" Margin="100,0,0,0" Width="42.5" Height="42.5" 
                       Source="Images/loading-gif-animation.gif" Stretch="Fill"/>-->       
            </StackPanel>                  

            <ListBox x:Name="lstWaitingPatients"       
                     DataContext="{Binding Mode=OneWay}" ItemsSource="{Binding Mode=OneWay}"
                     IsSynchronizedWithCurrentItem="true"
                     ItemTemplate="{StaticResource WaitingPatientsItemTemplate}"
                     FontSize="21.333" Height="423.291" ScrollViewer.VerticalScrollBarVisibility="Visible"
                     GotFocus="lstWaitingPatients_GotFocus"
                     />

        </StackPanel>
    </Border>

Хорошо, но если я просто закомментирую строку задания в выделенном коде, он будет запущен (хотя и без данных в списке):

    public partial class MainWindow : Window
{
    ListBox _activeListBox;

    public MainWindow()
    {
        clsPatients oPatients = new clsPatients(true);
        //lstWaitingPatients.DataContext = oPatients;

БЛАГОДАРНОСТЬ!

0
LSTayon 18 Авг 2009 в 22:59
Как отмечается в его ответе "sixlettervariables", вам не нужны некоторые привязки, которые вы выполняете на ListBox.
 – 
Joel B Fant
18 Авг 2009 в 23:15