Привязка к коллекции BindableCollection внутри пользовательского объекта WPF + Caliburn.Micro - PullRequest
0 голосов
/ 19 марта 2019

У меня есть класс Item со свойством типа BindableCollection с именем Children. У каждого ребенка есть разная информация, которую мне нужно отобразить, вот пример.

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 NotifyOfPropertyChange не запускаются при добавлении элементов в CurrentItem, поэтому ItemsChildren не обновляется. Как я могу заставить NotifyOfPropertyChange?

1 Ответ

0 голосов
/ 02 апреля 2019

Не уверен, что это будет работать, но в вашем коде CurrentItem является ObservableCollection (из 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">

Надеюсь, это поможет.

...