Как правильно использовать DataContext родительского класса - PullRequest
0 голосов
/ 06 марта 2012

У меня проблема с привязкой данных, возможно, небольшая. Я попытался реализовать шаблон MVVM в моем приложении. Поэтому у меня есть модель, содержащая мои данные. Эти данные периодически обновляются по сети. На вершине этой модели у меня есть модель представления для привязки. В этой модели представления у меня есть ObservableCollection, которую я хочу связать. У меня проблема в том, что моя модель представления должна быть глобальным ресурсом. Вот почему я использую следующую попытку в моем NavigationWindow:

<NavigationWindow.DataContext>
    <localvm:DataViewModel/>
</NavigationWindow.DataContext>

Причина, по которой я должен использовать ее в качестве глобальной переменной, заключается в том, что эта модель представления запускает мою сетевую бизнес-логику. Это, вероятно, плохой путь, но я не мог найти решение этой проблемы. Тем не мение чтобы отобразить мои данные, у меня в окне навигации есть фрейм, определенный следующим образом:

<Frame Source="/Views/Pages/Page1_SystemOverview.xaml" VerticalAlignment="Stretch></Frame>

на этой загруженной странице у меня есть ItemsControl для просмотра коллекции:

<Page>
<Grid>
    <Grid.Resources>
        <localcnv:DebugHelperConverter x:Key="debugCNV"/>
    </Grid.Resources>
    <StackPanel>
        <ItemsControl ItemsSource="{Binding Source=ListOfQuerys}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Vertical"></StackPanel>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>

        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                        <Button Content="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=(ItemsControl.AlternationIndex)}"/>
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    </StackPanel>   
</Grid>

Итак, вот моя проблема: когда я запускаю свою программу, ItemsControl содержит 18 элементов без содержимого вообще. Он должен содержать только два элемента, окно вывода не показывает ошибок привязки, но когда я изменяю ItemsSource на

"{Binding Path=ListOfQuerys}"

это говорит:

System.Windows.Data Information: 41 : BindingExpression path error: 'ListOfQuerys' property not found for 'object' because data item is null.  This could happen because the data provider has not produced any data yet. BindingExpression:Path=ListOfQuerys; DataItem=null; target element is 'ItemsControl' (Name=''); target property is 'ItemsSource' (type 'IEnumerable')

Что я делаю не так? Я думал, что когда я устанавливаю DataContext в родительском классе, я могу использовать его в дереве, но каким-то образом это не сработает, идеи?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 06 марта 2012

Если ListOfQuerys является свойством вашего объекта datacontext, создайте следующую привязку:

<ItemsControl ItemsSource="{Binding ListOfQuerys}">

По умолчанию источником является ваш datacontext, здесь ListOfQuerys - это путь.

0 голосов
/ 06 марта 2012

Содержимое элемента Frame не является частью визуального / логического дерева и, следовательно, не будет сохранять контекст данных.Вам придется установить его явно.

    <Frame Source="Page1.xaml" Navigated="Frame_Navigated"/>

    private void Frame_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
    {
        ((FrameworkElement) e.Content).DataContext = this.DataContext;
    }

Надеюсь, это поможет ...

0 голосов
/ 06 марта 2012

попробуй изменить

<ItemsControl ItemsSource="{Binding Source=ListOfQuerys}">

от

<ItemsControl ItemsSource="{Binding Source=ListOfQuerys, Mode=TwoWay}">
...