c# - 绑定(bind)到子项属性

标签 c# wpf mvvm

我有带有 View 模型的页面。 Page 使用 Frame.NavigationManager.Navigate()Frame 中显示。

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

这是我的:

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

问题

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

System.Windows.Data Error: 4 : Cannot find source for binding with reference

'ElementName=SomeDataGrid'. BindingExpression:Path=HasItems;

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

谁能解释一下我做错了什么?

最佳答案

可能 Items 集合在某个时候为空,这使得 GroupBox 变得折叠起来。当 GroupBox 折叠时,它会从 View 中删除其内容(DataGrid)。

随着 DataGrid 从 View 中移除,Binding 无法再找到它的引用,因此它中断了。

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

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

在 View 模型中:

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

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

关于c# - 绑定(bind)到子项属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32691819/

相关文章:

c# - 根据 ComboBox 选择更改 GroupBox 的内容

ios - 在 Controller Init 上分配 viewModel?

c# - 包含不同类型的泛型列表的泛型类

.net - 如何使用C#识别CMYK图像

c# - 是否可以保证使用任务工厂创建的任务不会在 WPF 的 UI 线程中安排?

c# - Windows 8.1 应用程序中的 FlipView 渲染问题

c# - 使用 Observable Collection MVVM 绑定(bind) Pivot 控件(windows phone 8)

c# - 为什么我的新 BitArray 初始化时使用了错误的值?

c# - Entity Framework 中导航属性延迟加载的逻辑

c# - 从两组日期范围 C# 中查找差距日期范围