WPF中的DataTrigger值绑定

5

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

我有一个 DataTrigger,如下所示:

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

现在,我想将 Value 绑定到变量 myVariable 。因此,如果 myVariable 的值更改,则DataTrigger的 Value 属性也会更改。
我尝试过设置Binding,但我猜它不可能设置。是否有其他方法可以动态设置这个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>

感谢您的选择。

DataTrigger.Value 不是一个依赖属性,因此直接使用它是行不通的,你需要一些技巧。 - Vlad
我知道,但是怎么办?能否以编程的方式编写一个DataTrigger呢? - Tanuj Wadhwa
例如,参见此答案,其中包含MultiBinding和转换器。 - Vlad
请检查此内容是否有所帮助- https://dev59.com/q1jUa4cB1Zd3GeqPPkB5 - RockWorld
1
我之前遇到过这个确切的问题,我通过将背景颜色绑定到对象并使用实现了 IValueConverter 接口的转换器来检查该对象并返回适当的颜色来解决它。肯定有更好的方法,但是时间紧迫,这种方法足以实现整个彩虹色系列。 - Gayot Fow
这个回答解决了你的问题吗?在DataTrigger条件的Value属性中使用绑定 - StayOnTarget
1个回答

4
根据我对您的问题的理解,您想找到一种方法根据视图模型中的某个属性值设置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();

        //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时,文本框的前景色将变为红色。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接