在WPF DataTrigger值中绑定
嗯,这可能是一个简单的问题,但我无法找到解决方案。
我有一个DataTrigger
现在我想将Value
绑定到变量myVariable
。 因此,如果myVariable
的值发生更改, myVariable
的Value
属性也会更改。
我试过设置Binding,但我想它不可能设置它。 有没有其他方法可以动态设置此值。
编辑:我尝试创建自己的数据触发器。 但我仍然无法让事情奏效。
这是代码:
DataTrigger d = new DataTrigger(); d.Binding = new Binding("Quantity"); d.Value = 1; Setter s = new Setter(BackgroundProperty, Brushes.Red); d.Setters.Add(s); Style st = new Style(typeof(DataGridRow)); st.Triggers.Add(d); this.Resources.Add(this.Resources.Count, st);
我想使用上面的代码代替xaml
谢谢。
根据我对您的问题的理解,您试图找到一种方法来根据视图模型的某个属性的值设置DataTrigger
的值。 所以我在这里有一个解决方案。
这是视图模型
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非常简单
您需要在代码后面创建数据触发器。
public MainWindow() { InitializeComponent(); //The view model object ViewModel vm = new ViewModel(); vm.CandidateValue = "1"; this.DataContext = vm; //create data trigger object for TextBox DataTrigger d = new DataTrigger(); //create binding object for data trigger Binding b = new Binding("Text"); ValueConverter c = new ValueConverter(); b.Converter = c; //create binding object for ValueConverter.CandidateValueProperty 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时,TextBox的前景将为红色。