WPF:如何从 Button 的 DataTemplate 将 bool 设置为 true?

WPF: How to set bool to true from DataTemplate for Button?

我知道可以通过使用 ICommand 来做到这一点,但由于这是我整个项目中唯一需要这样做的地方,我问自己,是否有比实施 RelayCommand 更好的解决方案,并且ICommand 和我的其他方法 属性-only class?

也许我的场景可能对这里有所帮助: 我有一个绑定到属性列表的 ListView(这是我用来显示这些的自定义 class)。 我在每行条目中都有一个按钮,我想将 "IsToDelete"-属性 设置为 true。

如果 "IsToDelete" 为真,我在 ListView 中显示的所有控件都会折叠。

DataTemplates 中的整个逻辑到此为止,我的按钮看起来像这样:

<DataTemplate x:Key="DeleteButtonTemplate">
  <Button Name="bt_Delete" 
   Command="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=ItemSource.DeleteClicked}">
    <Image Height="16" Width="16" Source="Images\RecycleBin\VSO_RecycleBin_16x.png"/>
    <Button.Style>
      <Style TargetType="{x:Type Button}">
        <Style.Triggers>
          <DataTrigger Binding="{Binding IsToDelete}" Value="True">
            <Setter Property="Visibility" Value="Collapsed"/>
          </DataTrigger>
        </Style.Triggers>
      </Style>
    </Button.Style>
  </Button>
</DataTemplate>

请注意,此 DataTemplate 中的命令目前未按预期工作,这就是我提出问题的原因 ;)

在最佳情况下,我只需要执行以下操作:

<Setter Property="{Binding IsToDelete}" Value="True"/>

那么,有没有办法像这样解决它,或者至少比 ICommand 和 RelayCommand 更简单?

为什么不使用 ToggleButton 并将 IsChecked 属性 绑定到视图模型的 IsToDelete 属性?

ItemsControl

的简化示例
<ItemsControl>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <ToggleButton Content="X" IsChecked="{Binding Path=IsToDelete}"/>
                <Border Width="100"                                
                        Background="MediumPurple" 
                        Margin="5">

                    <Border.Style>
                        <Style TargetType="Border">
                            <Setter Property="Visibility" Value="Visible"/>
                            <Style.Triggers>                                        
                                <DataTrigger Binding="{Binding Path=IsToDelete}" Value="True">
                                    <Setter Property="Visibility" Value="Collapsed"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </Border.Style>

                </Border>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>            
</ItemsControl>

您可以使用按钮的 Click 事件处理程序。那么你不需要任何命令。

private void bt_Delete_Click(object sender, RoutedEventArgs e)
{
    var btn = sender as Button;
    YourClass dc = btn.DataContext as YourClass;
    dc.IsToDelete = true;
}

我不太喜欢这个解决方案,但我认为它会奏效。