Memperbarui properti melalui datagrid wpf dalam koleksi melalui elemen individual

Oke di sini: sumber xaml yang dimaksud, di 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>

Selanjutnya, inilah Properti kelas objek vmPacketOrder. Saya yakin kolom clmPrint terikat dengan ini

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

Terakhir, inilah vmPacketPrinting yang dimaksud. Ini menggunakan kumpulan objek vmPacketOrder. rowCountSelected terikat ke kotak teks yang menampilkan jumlah baris yang dipilih. Saya telah menyelesaikan beberapa bagian lain, satu-satunya yang tersisa adalah memperbarui properti rowCountSelected ketika kotak centang di kolom dicentang. Saya kira saya bisa memeriksa properti isSelected untuk setiap item dalam koleksi pada pengatur waktu dan memperbaruinya seperti itu, tetapi akan jauh lebih baik jika saya bisa memiliki acara yang memperbaruinya ketika kotak centang dicentang atau tidak dicentang. Saya belum menemukan cara untuk melakukan ini sejauh ini.

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 sumber


Jawaban (1)


Setiap kali properti PacketOrders disetel ke ObservableCollection<vmPacketOrder> baru, Anda harus menghubungkan pengendali kejadian untuk semua objek vmPacketOrder individual:

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);
}

Ini akan menyebabkan rowCountSelected disetel setiap kali properti IsSelected dari vmPacketOrder disetel.

Jika item dapat ditambahkan ke koleksi PacketOrders secara dinamis, Anda juga harus menangani peristiwa CollectionChanged dan menghubungkan pengendali peristiwa ke item yang ditambahkan dan menghapus event handler dari event yang dihapus juga.

person mm8    schedule 22.09.2020