根据我对您的问题的理解,您想找到一种方法根据视图模型中的某个属性值设置DataTrigger的Value。因此,这里有一个解决方案。
以下是视图模型:
public class ViewModel : INotifyPropertyChanged
{
private string _text;
private string _candidateValue;
public string Text
{
get
{
return this._text;
}
set
{
this._text = value;
if (null != PropertyChanged)
{
this.PropertyChanged(this, new PropertyChangedEventArgs("Text"));
}
}
}
public string CandidateValue
{
get
{
return this._candidateValue;
}
set
{
this._candidateValue = value;
if (null != PropertyChanged)
{
this.PropertyChanged(this, new PropertyChangedEventArgs("Text"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
你需要在DataTrigger的绑定中使用IValueConverter
public class ValueConverter : DependencyObject, IValueConverter
{
public static readonly DependencyProperty CandidateValueProperty = DependencyProperty.Register("CandidateValue", typeof(string), typeof(ValueConverter));
public string CandidateValue
{
get { return (string)GetValue(CandidateValueProperty); }
set { SetValue(CandidateValueProperty, value); }
}
public ValueConverter()
: base()
{
}
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (null != value)
{
if (value.ToString() == this.CandidateValue)
return true;
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}
而且xaml非常简单
<TextBox x:Name="TextBox" Text="{Binding Text,UpdateSourceTrigger=PropertyChanged}">
</TextBox>
你需要在代码中创建数据触发器。
public MainWindow()
{
InitializeComponent();
ViewModel vm = new ViewModel();
vm.CandidateValue = "1";
this.DataContext = vm;
DataTrigger d = new DataTrigger();
Binding b = new Binding("Text");
ValueConverter c = new ValueConverter();
b.Converter = c;
Binding convertBinding = new Binding("CandidateValue");
convertBinding.Source = vm;
BindingOperations.SetBinding(c, ValueConverter.CandidateValueProperty, convertBinding);
d.Binding = b;
d.Value = true;
Setter s = new Setter(TextBox.ForegroundProperty, Brushes.Red);
d.Setters.Add(s);
Style st = new Style(typeof(TextBox));
st.Triggers.Add(d);
this.TextBox.Style = st;
}
这里的诀窍在于
ValueConverter
具有名为
CandidateValueProperty
的依赖属性。并且这个属性与视图模型的
CandidateValue
绑定。因此,当输入值等于视图模型的CandidateValue时,文本框的前景色将变为红色。
DataTrigger.Value
不是一个依赖属性,因此直接使用它是行不通的,你需要一些技巧。 - VladDataTrigger
呢? - Tanuj WadhwaMultiBinding
和转换器。 - Vlad