【问题标题】:How do I bind a datatrigger in xaml to a code-defined dependency property?如何将 xaml 中的数据触发器绑定到代码定义的依赖属性?
【发布时间】:2013-04-19 23:31:48
【问题描述】:

我的窗口代码定义了一个依赖属性,“Active”...

public partial class MainWindow : Window
{
  public MainWindow() { InitializeComponent(); }

  public bool Active
  {
     get { return (bool) GetValue(ActiveProperty); }
     set { SetValue(ActiveProperty, value); }
  }
  public static readonly DependencyProperty ActiveProperty =
      DependencyProperty.Register("Active", typeof(bool), typeof(MainWindow), new UIPropertyMetadata(false));
}

然后我使用 xaml 中的两个复选框绑定到该属性。我还想根据该属性更改矩形的填充。我怎样才能做到这一点?

<Window x:Class="WpfTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Height="350"
        Width="525"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
  <StackPanel>
    <CheckBox IsChecked="{Binding Active}" />
    <CheckBox IsChecked="{Binding Active}" />
    <Rectangle Fill="Gray"
               Width="50"
               Height="50">
      <Rectangle.Style>
        <Style TargetType="Rectangle">
          <Style.Triggers>
            <DataTrigger Binding="{Binding Active}"
                         Value="True">
              <Setter Property="Fill"
                      Value="Green" />
            </DataTrigger>
          </Style.Triggers>
        </Style>
      </Rectangle.Style>
    </Rectangle>
  </StackPanel>
</Window>

选中一个框会自动选中另一个框,但不会更改矩形颜色:(

【问题讨论】:

    标签: c# xaml data-binding datatrigger


    【解决方案1】:

    本地设置的属性总是覆盖样式集属性,因此您需要删除本地设置的属性并在您的样式中设置默认值:

    <Rectangle Width="50" Height="50">
        <Rectangle.Style>
            <Style TargetType="Rectangle">
                <Setter Property="Fill" Value="Gray" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Active}" Value="True">
                        <Setter Property="Fill" Value="Green"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Rectangle.Style>
    </Rectangle>
    

    【讨论】:

      【解决方案2】:

      一旦您设置了一个属性,该样式在该属性上定义的触发器将不再起作用。您可以定义另一个 dataTrigger 来更改 False 值的背景:

        <StackPanel>
              <CheckBox IsChecked="{Binding Active}"/>
              <CheckBox IsChecked="{Binding Active}"/>
              <Rectangle Width="50" Height="50">
                  <Rectangle.Style>
                      <Style TargetType="Rectangle">
                          <Style.Triggers>
                              <DataTrigger Binding="{Binding Active}" Value="True">
                                  <Setter Property="Fill" Value="Green"/>
                              </DataTrigger>
                              <DataTrigger Binding="{Binding Active}" Value="false">
                                  <Setter Property="Fill" Value="Gray"/>
                              </DataTrigger>
                          </Style.Triggers>
                      </Style>
                  </Rectangle.Style>
              </Rectangle>
          </StackPanel>
      

      【讨论】:

      • 我接受了另一个答案,因为它的语法更快、更简洁,但这个答案同样有效,所以请接受我谦虚的 +1。
      猜你喜欢
      • 2019-03-14
      • 2011-07-04
      • 2011-12-20
      • 1970-01-01
      • 2012-05-19
      • 2012-07-30
      • 2017-12-18
      • 2011-06-25
      • 1970-01-01
      相关资源
      最近更新 更多