将可见性绑定到Text.Length

时间:2012-12-03 10:05:51

标签: wpf xaml

我实现了一个小的视觉指示器(只是一个带边框的文本块),如果此刻没有要显示的文本,应该隐藏它。文本绑定到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事件时才有效?

2 个答案:

答案 0 :(得分:4)

我认为顾名思义,触发器只在事件发生时执行或检查其状态。 对于DataTrigger,它是PropertyChanged - 接口INotifyPropertyChanged的事件。

无法提升事件,DataTrigger不知道他必须检查绑定以及值是否符合触发条件。

答案 1 :(得分:2)

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

WPF主要依赖于数据绑定。当绑定源发生更改时,绑定对象会自动更新,因为引发了更改通知。当绑定到依赖项属性(即仅由WPF理解的属性类型)时,您已经内置了绑定对象的更改通知。无需额外的工作。

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

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