การอัปเดตคุณสมบัติผ่าน 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