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

时间:2016-06-01 09:27:27

标签: wpf xaml binding datatemplate

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

也许我的情景可能对此有所帮助: 我有一个ListView绑定到属性列表(这是我用来显示这些属性的自定义类)。 我在每行条目中都有一个按钮,我想将" IsToDelete" -Property设置为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更简单的方式解决它?

2 个答案:

答案 0 :(得分:1)

为什么不使用ToggleButton并将IsChecked属性绑定到viewModel的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>

答案 1 :(得分:0)

您可以使用Button的Click事件处理程序。那你就不需要任何命令了。

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

我真的不喜欢这个解决方案,但我想,它会起作用。

相关问题