我实现了一个小的视觉指示器(只是一个带边框的文本块),如果此刻没有要显示的文本,应该隐藏它。文本绑定到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事件时才有效?
答案 0 :(得分:4)
我认为顾名思义,触发器只在事件发生时执行或检查其状态。
对于DataTrigger,它是PropertyChanged
- 接口INotifyPropertyChanged
的事件。
无法提升事件,DataTrigger不知道他必须检查绑定以及值是否符合触发条件。
答案 1 :(得分:2)
您的源绑定是Indicator
,这是一个普通的CLR属性。
WPF主要依赖于数据绑定。当绑定源发生更改时,绑定对象会自动更新,因为引发了更改通知。当绑定到依赖项属性(即仅由WPF理解的属性类型)时,您已经内置了绑定对象的更改通知。无需额外的工作。
您还可以绑定到纯CLR属性,但在这种情况下,绑定对象没有内置更改通知。您需要以编程方式实施更改通知。这是通过提升PropertyChanged
事件来完成的。绑定到该CLR属性的对象将被通知值更改并将自行更新。
简而言之,如果您希望CLR属性更新目标绑定,则需要实现INotifyPropertyChanged
并引发PropertyChanged事件。