数据触发器的 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 中更改"已选择"值?

数据触发器的 Setter 是否可以修改 DataContext 中的属性

你可能以错误的方式思考它。

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"的地方在代码中执行此操作