我错误地使用了DependencyProperties吗?

时间:2010-10-17 05:23:14

标签: c# wpf dependency-properties

我已将我的依赖属性声明如下

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的一个   的DependencyObject。

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

更新:回应@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没有检测到这种变化?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

在您之后定义的触发器中,值应为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}"/>

答案 2 :(得分:0)

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

<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>