如何正确使用父类的DataContext

时间:2012-03-06 11:30:26

标签: c# wpf xaml data-binding datacontext

我的数据绑定存在问题,可能是一个小问题。我试图在我的应用程序中实现MVVM模式。因此我有一个模型包含我的数据。此数据以定期方式通过网络更新。在这个模型的顶部,我有一个要绑定的视图模型。在这个视图模型中,我有一个ObservableCollection,我想绑定它。我遇到的问题是,我的视图模型需要是一个全局资源。这就是我在NavigationWindow中使用以下尝试的原因:

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

我必须将其用作全局变量的原因是,此视图模型启动了我的网络业务逻辑。这可能是一个糟糕的方式,但我无法找到解决方案。无论如何 为了显示我的数据,我的NavigationWindow中有一个Frame定义如下:

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

在这个加载的页面中,我有一个ItemsControl来查看Collection:

<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 :(得分:0)

尝试改变

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

通过

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

答案 1 :(得分:0)

如果ListOfQuerys是您的datacontext对象的属性,请进行以下绑定:

<ItemsControl ItemsSource="{Binding ListOfQuerys}">

默认情况下,source是您的datacontext,这里是ListOfQuerys路径。

答案 2 :(得分:0)

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;
    }

希望这会有所帮助......