gpt4 book ai didi

c# - 在 WPF DataTrigger 值中绑定(bind)

转载 作者:太空狗 更新时间:2023-10-29 23:23:32 26 4
gpt4 key购买 nike

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

我有一个 DataTrigger 作为

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

现在我想将 Value 绑定(bind)到变量 myVariable。因此,如果 myVariable 的值发生变化,DataTrigger 的 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

<Page.Resources>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding Quantity}" Value="1">
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</Page.Resources>

谢谢。

最佳答案

根据我对您的问题的理解,您正在尝试根据 View 的一个属性的值找到一种方法来设置 DataTriggerValue模型。所以这里我有一个解决方案。

这是 View 模型

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 的绑定(bind)中需要一个 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 的依赖属性。并且此属性绑定(bind)到 View 模型的 CandidateValue。因此,当输入值等于 View 模型的 CandidateValue 时,TextBox 的前景将为红色。

关于c# - 在 WPF DataTrigger 值中绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17000901/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com