绑定到子项属性

时间:2015-09-21 09:35:22

标签: c# wpf mvvm

我有他们的视图模型的页面。 Page使用Frame替换Frame.NavigationManager.Navigate()

在一个Page中,我有GroupBox个孩子DataGrid。我希望GroupBox根据Visibility中的项目计数更改DataGrid

这就是我所拥有的:

<GroupBox ....
          Visibility="{Binding ElementName=SomeDataGrid,
                                   Path=HasItems,
                                   Converter={StaticResource BooleanToVisibilityConverter}}">
        <DataGrid x:Name="SomeDataGrid"
                  IsReadOnly="True"
                  ItemsSource="{Binding Items}"/>
</GroupBox>

问题

Page更改为另一个并返回后,我有以下绑定异常

  

System.Windows.Data错误:4:无法找到与引用绑定的源

     

&#39;的ElementName = SomeDataGrid&#39 ;. BindingExpression:路径= HasItems;

我尝试使用x:Reference,但遇到了同样的问题。

有人可以解释我做错了吗?

1 个答案:

答案 0 :(得分:2)

可能Items集合在某些时候是空的,这会导致GroupBox崩溃。当GroupBox折叠后,它会从视图中删除其内容(DataGrid)。

从视图中移除DataGrid后,Binding无法再找到其引用,因此会中断。

如果我是你,我会将GroupBox Visibility直接绑定到ViewModel属性,而不是将其绑定到DataGrid

<GroupBox ....
          Visibility="{Binding HasItems,
                               Converter={StaticResource BooleanToVisibilityConverter}}">
        <DataGrid x:Name="SomeDataGrid"
                  IsReadOnly="True"
                  ItemsSource="{Binding Items}"/>
</GroupBox>

在ViewModel中:

public bool HasItems
{
    get
    {
        return Items != null && Items.Count() > 0;
    }
}

public IEnumerable Items
{
    get
    {
        // ...
    }
    set
    {
        // ...
        RaisePropertyChanged("HasItems");
    }
}