【问题标题】:Am I using DependencyProperties wrongly?我是否错误地使用了依赖属性?
【发布时间】:2011-04-26 12:19:07
【问题描述】:

我已经声明了我的依赖属性如下

public bool CanSave
{
    get { return (bool)GetValue(CanSaveProperty); }
    set { SetValue(CanSaveProperty, value); }
}

public static readonly DependencyProperty CanSaveProperty =
    DependencyProperty.Register("CanSave", typeof(bool), typeof(EditorTabViewModel), new PropertyMetadata(false));

在 XAML 中,我想要一个触发器,它可以根据我的依赖属性的值触发样式。在这种情况下,如果CanSave 为真,则为粗体

<Style x:Key="CanSaveIndicatorHeader">
    <Style.Triggers>
        <Trigger Property="{Binding CanSave}" Value="True">
            <Setter Property="TextBlock.FontWeight" Value="Bold" />
        </Trigger>
    </Style.Triggers>
</Style>

我收到了错误

无法在 “触发器”类型的“属性”属性。 “绑定”只能设置在 a 的 DependencyProperty 依赖对象。

我可能做错了什么。有人可以纠正我吗?

更新:回应@Bryan Watts

好的,所以我做了类似的事情

<Style.Triggers>
    <Trigger Property="vm:EditorTabViewModel.CanSave" Value="true">
        <Setter Property="TextBlock.FontWeight" Value="Bold" />
    </Trigger>
    <Trigger Property="vm:EditorTabViewModel.CanSave" Value="false">
        <Setter Property="TextBlock.Foreground" Value="Red" />
    </Trigger>
</Style.Triggers>

然后我发现 CanSave 从来没有设置为 true,然后我做了

<TextBox ... Text="{Binding Path=Content, UpdateSourceTrigger=PropertyChanged}" />

因为 CanSave 在内容更改时设置为 true

public string Content
{
    ...
    set
    {
        if ((bool)GetValue(CanSaveProperty) == false)
        {
            SetValue(CanSaveProperty, true);
            RaisePropertyChanged("CanSave");
        } 
        _content = value;
    }
}

不过好像

<Trigger Property="vm:EditorTabViewModel.CanSave" Value="true">

nv 发生是因为字体从不粗体。似乎 WPF 没有检测到更改?

【问题讨论】:

    标签: c# wpf dependency-properties


    【解决方案1】:

    我发现在某些(可能是所有)情况下,当在样式中使用触发器时,您还需要在触发器之外指定相反的设置器:例如:

    <Style x:Key="CanSaveIndicatorHeader">
        <Setter Property="TextBlock.FontWeight" Value="Normal" />
        <Style.Triggers>
            <Trigger Property="{Binding CanSave}" Value="True">
                <Setter Property="TextBlock.FontWeight" Value="Bold" />
            </Trigger>
        </Style.Triggers>
    </Style>
    

    【讨论】:

      【解决方案2】:

      在您稍后定义的触发器中,值应该是 Value="True" 而不是 Value="true"。

      如果您定义样式的目标类型,然后使用要绑定的属性,则触发器可以变得更简单。就像您想在 TextBlock 中应用样式一样,targettype 是 TextBlock,为 Text 属性添加一个触发器,值为“True”和“False”,然后将 TextBlock 的 Text 属性与依赖属性(CanSave / Content)绑定

      风格,

          <Style x:Key="CanSaveIndicatorHeader" TargetType="TextBlock">
              <Style.Triggers>
                  <Trigger Property="Text" Value="True">
                      <Setter Property="TextBlock.FontWeight" Value="Bold" />
                  </Trigger>
              </Style.Triggers>
          </Style>
      

      绑定,

      <TextBlock Style="{StaticResource CanSaveIndicatorHeader}" Text="{Binding CanSave}"/>
      

      【讨论】:

        【解决方案3】:

        Trigger 属性只需要属性的名称,而不是对其的绑定:

        <Trigger Property="CanSave" Value="True">
        

        【讨论】:

        • 谢谢。但请参阅更新:回应@Bryan Watts。似乎 WPF 没有检测到更改?
        • @jiewmeng:您能否编辑您的问题以包含CanSave 属性的声明?您使用的语法,名称命名空间和类名,暗示它是一个附加属性。您是否尝试过使用CanSave 而不是vm:EditorTabViewModel.CanSave 最近的更新?
        • CanSave 的声明 if 在第一个代码 sn-p 中?还是你要求别的?如果我刚刚做了CanSave,我会得到类似“无法解析样式属性'CanSave'。验证拥有类型是样式的TargetType,或使用Class.Property 语法来指定属性”
        • 是的,抱歉,我错过了注册电话。我不确定为什么触发器对你不起作用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 2014-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多