3

我实现了一个小的视觉指示器(只是一个带边框的文本块),如果目前没有要显示的文本,它应该被隐藏。文本绑定到Indicator属性,数据上下文似乎设置正确。

到目前为止我得到的是这个(指示文本出现,隐藏/显示不起作用):

<Border>
    <Border.Style>
        <Style TargetType="{x:Type Border}">
            <Setter Property="Visibility" Value="Visible"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Indicator.Length}" Value="0">
                    <Setter Property="Visibility" Value="Hidden"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
    <TextBlock Text="{Binding Indicator}" />
</Border>

我的问题是,如果文本长度为零,则元素不会隐藏。

你发现我的错误了吗?

指示器是相应视图模型的一部分:

public string Indicator
{ get; set;}

更新

如果我将上面的属性更改为此,它会起作用:

public const string IndicatorPropertyName = "Indicator";
private string _indicator = "";
public string Indicator
{
    get
    { return _indicator;}

    set
    {
        if (_indicator == value) { return;}

        RaisePropertyChanged(IndicatorPropertyName);
    }
}

如果我引发 PropertyChanged 事件,为什么它只起作用?

4

2 回答 2

4

我认为顾名思义,触发器仅在事件发生时执行或检查其状态。在 DataTrigger 的情况下,它是PropertyChangedinterface的 -Event INotifyPropertyChanged

如果不引发事件,DataTrigger 不知道他必须检查绑定以及值是否满足触发条件。

于 2012-12-03T10:37:37.830 回答
2

您的源绑定是Indicator一个普通的 CLR 属性。

WPF 在很大程度上基于数据绑定。当绑定源更改时,绑定对象会自动更新,因为在后台会引发更改通知。当绑定到依赖属性(即只有 WPF 才能理解的属性类型)时,您已经为绑定对象内置了更改通知。不需要额外的工作。

您也可以绑定到普通的 CLR 属性,但在这种情况下,绑定对象没有内置的更改通知。您需要以编程方式实现更改通知。这是通过引发PropertyChanged事件来完成的。绑定到该 CLR 属性的对象将收到值更改通知,并将自行更新。

简而言之,如果您希望 CLR 属性更新目标绑定,则需要实现INotifyPropertyChanged并引发 PropertyChanged 事件。

于 2012-12-03T11:36:07.940 回答