【问题标题】:Updating a property through wpf datagrid in a collection through the individual element通过单个元素在集合中通过 wpf datagrid 更新属性
【发布时间】:2021-01-07 18:40:19
【问题描述】:

这里好:有问题的源 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";

【问题讨论】:

    标签: c# wpf object properties binding


    【解决方案1】:

    每当PacketOrders 属性设置为新的ObservableCollection&lt;vmPacketOrder&gt;,您应该为所有单独的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 在设置vmPacketOrderIsSelected 属性时设置。

    如果项目可以动态添加到 PacketOrders 集合中,您还应该 handle CollectionChanged 事件并将事件处理程序连接到添加的项目并从已删除的事件中删除事件处理程序。

    【讨论】:

      猜你喜欢
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 2017-11-28
      相关资源
      最近更新 更多