在下面的代码中,当在组合框中输入无效值(例如“a”)时,抛出异常并且WPF将Validation.HasError设置为true。组合框触发器尽职地将背景设置为蓝色。但是,我希望Tag属性也设置为'true',并且因为它在底层datacontext中被数据绑定到B,所以你可能期望B也被更新为'true'。但是,据我所知,由于验证失败,绑定引擎会停止并且不会运行任何转换器 - 下面的ConvertBack方法根本不会被调用。
但是,snoop实用程序将Tag显示为其“默认”值(由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 :(得分:1)
这仅仅是由于依赖属性优先级。您已为Tag
属性设置了本地值,该属性优先于您的样式触发器。另一方面,Background
没有指定本地值,因此样式触发器设置的值将成为有效值。
请参阅MSDN上的Dependency Property Value Precedence。