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;
}
我不太喜欢这个解决方案,但我认为它会奏效。
我知道可以通过使用 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;
}
我不太喜欢这个解决方案,但我认为它会奏效。