c# – 绑定到子项属性

我有他们的视图模型的页面.使用Frame.NavigationManager.Navigate()在Frame中显示页面.

在一个页面中,我有一个带有子DataGrid的GroupBox.我希望GroupBox根据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 Error: 4 : Cannot find source for binding with reference

‘ElementName=SomeDataGrid’. BindingExpression:Path=HasItems;

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

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

最佳答案 可能,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");
    }
}
点赞