首页 > 解决方案 > 绑定到自定义对象 WPF + Caliburn.Micro 内的 BindableCollection

问题描述

我有一个类,它有一个名为 ChildrenItem的类型的属性。BindableCollection每个孩子都有不同的信息需要显示,这里有一个例子。

Public Property CurrentItem() As ObservableCollection(Of ItemModel)
        'Used for displaying all item information
        'Will only hold one item
        Get
            Return _currentItem
        End Get
        Set(ByVal value As ObservableCollection(Of ItemModel))
            _currentItem = value
            NotifyOfPropertyChange(Function() CurrentItem)
            NotifyOfPropertyChange(Function() ItemsChildren)
        End Set
End Property

Public Property ItemsChildren() As BindableCollection(Of ChildModel)
            Get
                If CurrentItem.Count > 0 Then
                    Return CurrentItem(0).Children
                Else
                    Return New BindableCollection(Of ChildModel)
                End If
            End Get
            Set(ByVal value As BindableCollection(Of ChildModel))
                _itemChildren = value
            End Set
End Property

XAML

 <!-- Child Info DataGrid-->
    <DataGrid ItemsSource="{Binding Path=ItemsChildren}" Grid.Row="3" Grid.ColumnSpan="2" Margin="10" AutoGenerateColumns="False" AlternatingRowBackground="Gray" CanUserAddRows="False" HorizontalAlignment="Stretch">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Child" Binding="{Binding Path=ChildItem}" />
            <DataGridTextColumn Header="Name" Binding="{Binding Path=ItemName}" />
            <DataGridTextColumn Header="Assy" Binding="{Binding Path=Assembly}"/>
            <DataGridTextColumn Header="Balloon Number" Binding="{Binding Path=BallNo}"/>
            <DataGridTextColumn Header="Link Text" Binding="{Binding Path=LinkText}"/>
            <DataGridTextColumn Header="Qty" Binding="{Binding Path=Quantity}"/>
        </DataGrid.Columns>
    </DataGrid>

ChildModel 只是一个类,它具有数据网格中值的属性

将项目添加到 CurrentItem 时,两个 CurrentItemNotifyOfPropertyChange都不会运行,因此不会更新 ItemsChildren。我怎么能强迫NotifyOfPropertyChange

标签: wpfvb.netdata-bindingcaliburn.micro

解决方案


不确定这是否可行,但在您的代码中 CurrentItem 是 ObservableCollection(of ItemModel)。因为 CurrentItem 只会保存一个值,所以它应该是:

 Public Property CurrentItem() As ItemModel
        'Used for displaying all item information
        'Will only hold one item
        Get
            Return _currentItem
        End Get
        Set(ByVal value As ItemModel
            _currentItem = value
            NotifyOfPropertyChange(Function() CurrentItem)
            NotifyOfPropertyChange(Function() ItemsChildren)
        End Set
End Property

当数据网格中的选择发生变化时,这应该会触发 NotifyOfPropertyChange()。在您的 XAML 中,您还需要添加 SelectedItem 属性:

<DataGrid ItemsSource="{Binding Path=ItemsChildren}" SelectedItem="{Binding Path=ItemModel, Mode=TwoWay}" Grid.Row="3" Grid.ColumnSpan="2" Margin="10" AutoGenerateColumns="False" AlternatingRowBackground="Gray" CanUserAddRows="False" HorizontalAlignment="Stretch">

希望这可以帮助。


推荐阅读