数据触发器的 Setter 是否可以修改 DataContext 中的属性
本文关键字:修改 DataContext 属性 触发器 Setter 是否 数据 | 更新日期: 2023-09-27 18:33:11
我有一个复选框,我计划在其上实现"全选"功能。
我认为最简单的实现是使用数据触发器修改我的数据模板,以将 IsChecked 属性更改为真/假。
<UserControl.Resources>
<DataTemplate x:Key="MyTemplate">
<Grid>
<CheckBox x:Name="Selection" IsChecked="{Binding Selected}" />
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding ElementName=SelectAll, Path=IsChecked}" Value="true">
<Setter TargetName="Selection" Property="DataContext.Selected" Value="true" />
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=SelectAll, Path=IsChecked}" Value="false">
<Setter TargetName="Selection" Property="IsChecked" Value="false" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</UserControl.Resources>
<Grid>
<CheckBox Name="SelectAll />
<ListView Name="lvSteps" ItemTemplate="{StaticResource MyTemplate}" ItemsSource="{Binding MyList}" />
</Grid>
但是,这会覆盖复选框的绑定,该复选框设置为数据上下文属性"选定",仅与数据触发器中设置的布尔值。
这样想就完全有道理了。
所以我的问题是,我可以通过 Setter 更改 DataTrigger 中 DataContext 属性的值吗?
因此,我可以将复选框绑定到"已选择",并在数据触发器的 Setter 中更改"已选择"值?
你可能以错误的方式思考它。
SelectAll
是容器元素(假设 ListVM)的一部分,该元素实习生包含包含Selected
的对象 (ListItemVM),因此如果您选中SelectAll
,您可以并且应该迭代您的元素并将Selected
设置为 true,并且此项目在那里使用 INotifyPropertyChanged 以通知您的复选框
编辑以征求意见
没有必要挂接事件SelectAll
只需绑定到它并在设置部分中做你的事情
public bool SelectAll
{
get { return _selectAll;}
set
{
_selectAll = value;
RaisPropertyChanged();
foreach( var item in MyList)
{
item.Select = _selectAll;
}
}
}
另外,为什么要在 xaml 中执行此操作?
因为您可以使用接口并以一种可以在许多地方使用它的方式分解它,而无需代码冗余,因此您也可以从能够访问"ListVM"的地方在代码中执行此操作