【问题标题】:WPF: How to set bool to true from DataTemplate for Button?WPF:如何将按钮的 DataTemplate 中的 bool 设置为 true?
【发布时间】:2016-09-30 13:58:49
【问题描述】:

我知道通过使用 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 更简单的方式来解决它?

【问题讨论】:

  • 点击Button后是否要将ButtonVisibility设置为Collapsed
  • 你如何将数据上下文分配给页面/按钮,这个命令在哪里定义了 IsToDelete 属性?
  • @StepUp 是的,这正是我想要做的,但由于这不是唯一要更改的控件,我需要将布尔值 IsToDelete 设置为 true。
  • @KyloRen 我将代码隐藏中的 Itemssource 分配给列表视图,从中复制此模板。我将 ICommand 作为简单属性添加到属性类中,IsToDelete-Boolean 也在这个类中。
  • @ExoWork 您的按钮获取的数据上下文是什么? IsToDelete 属性在哪里定义?

标签: wpf xaml data-binding datatemplate


【解决方案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>

【讨论】:

  • ... 有时我太专注于一个问题,以至于我错过了简单的路径^^ 我仍然想知道,如果只用一个按钮就可以了。还是谢谢
【解决方案2】:

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

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

我不太喜欢这个解决方案,但我认为它会起作用。

【讨论】:

    猜你喜欢
    • 2021-05-24
    • 2012-09-06
    • 2016-04-30
    • 2012-10-16
    • 2011-04-06
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多