绑定WPF数据触发器值

本文关键字:触发器 数据 WPF 绑定 | 更新日期: 2023-09-27 18:17:34

嗯,这可能是一个简单的问题,但我不能找到一个解决方案。

我有一个DataTrigger作为

<DataTrigger Binding="{Binding Quantity}" Value="0">

现在我想将Value绑定到变量myVariable。因此,如果myVariable的值发生变化,则datattrigger的Value属性也会发生变化。

我试过设置绑定,但我猜它不可能设置它。是否有其他方法可以动态设置这个值。

编辑:我试着创建一个我自己的数据触发器。但是我还是不能把东西修好。

这是代码:

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
<Page.Resources>
    <Style TargetType="DataGridRow">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Quantity}" Value="1">
                <Setter Property="Background" Value="Red" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Page.Resources>

谢谢。

绑定WPF数据触发器值

我对你的问题的理解,你正试图找到一种方法来设置你的DataTriggerValue根据你的视图模型的属性之一的值。所以我有了一个解决方案。

这是视图模型

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();
        //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的前景将是红色的。