C# 绑定数据触发器';s`Value`to`VModel`
我的Vmodel中有一个int值:C# 绑定数据触发器';s`Value`to`VModel`,c#,wpf,silverlight,mvvm,C#,Wpf,Silverlight,Mvvm,我的Vmodel中有一个int值: public int MaxTagCount => URLsCount.Max(tag => tag.Count); 我需要将此MaxTagCount与触发器连接: <DataTrigger Binding="{Binding Count}" Value="1149"> <Setter Property="FontWeight" Value="Bold"/> <Setter Property="
public int MaxTagCount => URLsCount.Max(tag => tag.Count);
我需要将此MaxTagCount
与触发器连接:
<DataTrigger Binding="{Binding Count}" Value="1149">
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
如何将“1149”替换为
MaxTagCount
如果我理解正确,您正在寻找将DataTrigger
的值
绑定到MaxTagCount
属性的方法,这是不可能的,因为值
不是依赖性属性
最常见的解决方法是将MaxTagCount
属性和Count
属性传递给多值转换器
,转换器将比较这两个值并返回true或false。DataTrigger
现在的作用是检查转换器返回的值,以便:
首先定义一个比较两个值的基本转换器,如下所示:
public class CompareValuesConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values?[0].Equals(values[1]);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
第二次,更新您的数据触发器
以检查转换器的返回值,并将您的值传递给转换器,并相应地设置您的样式:
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding >
<MultiBinding.Converter>
<local:CompareValuesConverter/>
</MultiBinding.Converter>
<Binding Path="Count" />
<Binding Path="DataContext.MaxTagCount" ElementName="Main"/>
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
请注意,我正在使用
ElementName
绑定来获取MaxTagCount
值,因为它(很可能)是在全局UIDataContext
上定义的(在本例中,主窗口名为main
),您也可以使用相对资源
绑定。正如@Elhamer所解释的,无法绑定到DataTrigger的Value属性,因为它不是依赖项属性
作为使用多重转换器的替代方法,您可以向视图模型添加另一个属性,该属性返回一个bool,指示Count
和MaxTagCount
属性是否相等:
public bool IsMax => Count == MaxCount;
…并与此绑定:
<DataTrigger Binding="{Binding IsMax}" Value="True">
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
毕竟,视图模型只不过是视图的模型,在那里实现这种逻辑非常有意义。这个解决方案非常有趣,但是如果
Max
都是真的,触发器就不起作用了。我的bool属性是=public bool IsMax=true
,触发器就像你的答案一样,但是DataTrigger
不起作用这个答案有点不完整,这可能就是为什么它对你不起作用的原因。每当Count或MaxCount更改时,您还需要为IsMax属性触发PropertyChanged事件。是否在视图模型中实现INotifyPropertyChanged事件?