如何解决通过单个元素中的集合中的wpf datagrid更新属性
确定:在ucPacketPrinting.xaml中有问题的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,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,UpdateSourceTrigger=PropertyChanged}" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="HorizontalAlignment" Value="Center" />
</Style>
</DataGridCheckBoxColumn.EditingElementStyle>
</DataGridCheckBoxColumn>
接下来,这是vmPacketOrder对象类Property。我认为“ 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";
解决方法
每当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
的{{1}}属性,这将导致IsSelected
被设置。
如果可以将项目动态添加到vmPacketOrder
集合中,则还应该handle PacketOrders
事件,并将事件处理程序挂接到添加的项目上,并从已删除的事件中删除事件处理程序
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。