Обновление свойства через wpf datagrid в коллекции через отдельный элемент

Хорошо здесь: исходный xaml в вопросе, в ucPacketPrinting.xaml

 <DataGridCheckBoxColumn
                        x:Name="clmPrint"
                        Binding="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                        Header="Print"
                        HeaderStyle="{StaticResource DataGridColumnHeaderStyle2}" IsReadOnly="True">
                        <DataGridCheckBoxColumn.CellStyle>
                            <Style TargetType="DataGridCell">
                                <Style.Triggers>
                                    <Trigger Property="IsMouseOver" Value="True">
                                        <Setter Property="IsEditing" Value="True" />
                                    </Trigger>
                                </Style.Triggers>
                            </Style>
                        </DataGridCheckBoxColumn.CellStyle>
                        <DataGridCheckBoxColumn.ElementStyle>
                            <Style TargetType="CheckBox">
                                <Setter Property="IsChecked" Value="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                                <Setter Property="VerticalAlignment" Value="Center" />
                                <Setter Property="HorizontalAlignment" Value="Center" />
                            </Style>
                        </DataGridCheckBoxColumn.ElementStyle>
                        <DataGridCheckBoxColumn.EditingElementStyle>
                            <Style TargetType="CheckBox">
                                <Setter Property="IsChecked" Value="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                                <Setter Property="VerticalAlignment" Value="Center" />
                                <Setter Property="HorizontalAlignment" Value="Center" />
                            </Style>
                        </DataGridCheckBoxColumn.EditingElementStyle>
                    </DataGridCheckBoxColumn>

Далее, вот свойство класса объекта vmPacketOrder. Я считаю, что столбец clmPrint привязан к этому

private bool isSelected = false;
…
public bool IsSelected
        {
            get => isSelected;
            set {
                Set(value, x => isSelected);
            }
        }

Наконец, вот рассматриваемый vmPacketPrinting. При этом используется коллекция объектов vmPacketOrder. rowCountSelected привязан к текстовому полю, в котором отображается количество выбранных строк. Я проработал некоторые другие части, осталось только обновить свойство rowCountSelected, когда установлен флажок в столбце. Я думаю, я мог бы заставить его проверять свойство isSelected для каждого элемента в коллекции по таймеру и обновлять его таким образом, но было бы намного лучше, если бы я мог просто иметь событие, которое обновляет его, когда флажок установлен или снят. Я пока не нашел способа сделать это на самом деле.

private ObservableCollection<vmPacketOrder> packetOrders;
…
public ObservableCollection<vmPacketOrder> PacketOrders
        {
            get {
                return packetOrders;
            }
            set => Set(value ?? new ObservableCollection<vmPacketOrder>(), x => packetOrders);
        }
…
public string rowCountSelected { get; set; } = "0";

person Skyler Gunn    schedule 21.09.2020    source источник


Ответы (1)


Всякий раз, когда для свойства PacketOrders устанавливается новое значение ObservableCollection<vmPacketOrder>, вы должны подключить обработчик событий для всех отдельных объектов vmPacketOrder:

private ObservableCollection<vmPacketOrder> packetOrders;
public ObservableCollection<vmPacketOrder> PacketOrders
{
    get
    {
        return packetOrders;
    }
    set
    {
        if (packetOrders != null)
            foreach (var packetOrder in packetOrders)
                packetOrder.PropertyChanged -= OnPropertyChanged;

        Set(value ?? new ObservableCollection<vmPacketOrder>(), x => packetOrders);

        if (packetOrders != null)
            foreach (var packetOrder in packetOrders)
                packetOrder.PropertyChanged += OnPropertyChanged;
    }
}

private void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == nameof(vmPacketOrder.IsSelected))
        rowCountSelected = packetOrders.Count(x => x.IsSelected);
}

Это приведет к установке rowCountSelected всякий раз, когда установлено свойство IsSelected для vmPacketOrder.

Если элементы могут быть добавлены в коллекцию PacketOrders динамически, вам также следует обработать событие CollectionChanged и подключить обработчики событий к добавленным элементам. а также удалить обработчики событий из удаленных событий.

person mm8    schedule 22.09.2020