2012-03-03 146 views
0

在下面的代码中,当在组合框中输入无效值(例如“a”)时,会引发异常,并且WPF会将Validation.HasError设置为true。组合框触发器忠实地将背景设置为蓝色。不过,我希望Tag属性也设置为'true',并且由于它是基础数据环境中的B的数据绑定,所以您可能希望B也更新为'true'。然而,据我所知,当验证失败时,绑定引擎停止并且不运行任何转换器 - 下面的ConvertBack方法根本不被调用。为什么Tag属性不被更新?

但是,snoop实用程序显示标签保持其“默认”值(由datacontext中的属性B给出)。

任何洞悉为什么将不胜感激。

<Window 
x:Class="WpfApplication1.MainWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300"> 
<Window.Resources> 
    <Style TargetType="ComboBox"> 
     <Style.Triggers> 
      <Trigger Property = "Validation.HasError" Value = "true"> 
       <Setter Property="Tag" Value="true"/> 
       <Setter Property="Background" Value="Blue"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
<StackPanel> 
    <ComboBox Height="23" IsEditable="True" Name="comboBox1" Width="120" 
       Tag="{Binding Path=B, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource MyConverter}}" 
      Text="{Binding Path=A, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=True}"/> 
</StackPanel> 

public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      DataContextClass dataContext = new DataContextClass(); 
      this.DataContext = dataContext ; 

     } 

    } 

    public class DataContextClass : INotifyPropertyChanged 
     { 
      public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
      private string b = "default"; 
      public string B 
      { 
       get { return b; } 
       set 
       { 
        b = value; 
        PropertyChanged(this, new PropertyChangedEventArgs("B")); 
       } 
      } 

      private int a; 
      public int A 
      { 
       get { return a; } 
       set 
       { 
        a = value; 
        PropertyChanged(this, new PropertyChangedEventArgs("A")); 
       } 
      } 
     } 


public class MyConverter : IValueConverter 
    { 
     #region Public Methods 

     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return value; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return value as string; 
     } 

     #endregion 
    } 
+0

验证在哪里? – kaj 2012-03-03 10:51:36

+0

@KAJ validatesonexceptions = true绑定Text属性 – sturdytree 2012-03-03 10:53:00

+0

不,是什么让“a”成为无效值? – kaj 2012-03-03 10:54:57

回答

1

这仅仅是由于依赖项属性的优先级。您已为Tag属性设置了一个本地值,该属性优先于您的样式触发器。另一方面,Background没有指定本地值,因此由样式触发器设置的值变为有效值。

请参阅MSDN上的Dependency Property Value Precedence

+0

谢谢肯特,非常好。有没有办法访问DataContext(ViewModel)中的HasError值?这是我想要实现的。 – sturdytree 2012-03-03 11:04:34

+0

@sturdytree:您可以使用'Mode = OneWayToSource'将'Validation.HasError'绑定到虚拟机上的一个属性。 – 2012-03-03 12:46:10

+0

肯特,谢谢,但Validation.HasError =“{绑定路径= B,模式= OneWayToSource}”导致编译错误“Validation.HasError是只读的,不能从标记设置” – sturdytree 2012-03-03 13:40:53

相关问题