2010-01-29 106 views
1

我正在使用我的自定义验证引擎来验证我的ViewModel属性。我被困在最后一步。我想在验证失败时更改TextBox的背景颜色。所以,我实现了DataTrigger s并将它绑定到HasError属性。 HasError是一个正常的CLR属性。WPF数据触发器和更改控件的样式

public bool HasError 
     { 
      get 
      { 
       var hasError = Errors.Count() > 0; 
       return hasError; 
      } 
     } 

这里是代码:

<Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}">     

      <Style.Triggers> 

       <DataTrigger Binding="{Binding Path=HasError}" Value="True"> 

        <Setter Property="Background" Value="Red" /> 
       </DataTrigger>   


      </Style.Triggers> 

     </Style> 

的问题是,它在this.DataContext被分配到一个视图模型将只触发一次。所以,我想也许我可以使用依赖属性而不是普通属性,但是也没有解决。

任何想法?

UPDATE:

这似乎是DataTrigger s的只有发射时钩住CLR性质,而不是依赖属性。

更新2:

如果只有下面的代码工作:

****<Trigger Property="{Binding Path=HasError}" Value="True"> 
        <Setter Property="Background" Value="Red" /> 
       </Trigger>**** 

UPDATE 3个工作:

正如答复中提到我不得不解雇了INotifyPropertyChanged事件。

公共 的ObservableCollection 错误 { {返回(的ObservableCollection)的GetValue(ErrorsProperty); } 设置 { 的SetValue(ErrorsProperty,值);

  OnPropertyChanged("HasError"); 

     } 
    } 

回答

1

WPF系统永远不会知道你的HasError性质发生变化,这就是为什么它只能触发一次。实现此目的的方法之一是在错误收集发生更改时实施INotifyPropertyChanged并触发PropertyChanged事件。

+0

哦,你是救世主!太感谢了。我更新了代码以反映更改。 – azamsharp 2010-01-29 16:23:48

+0

在我的代码中发现了一个错误。所有的属性都依赖于Errors集合。这意味着如果在错误收集中存在单个条目,则全部为红色。 – azamsharp 2010-01-29 16:43:02