将DataTrigger的`Value`绑定到`VModel`

时间:2018-02-19 00:30:41

标签: c# wpf silverlight mvvm

我的Vmodel中有一个int值:

public int MaxTagCount => URLsCount.Max(tag => tag.Count);

我需要将此MaxTagCount与Trigger连接:

 <DataTrigger Binding="{Binding Count}" Value="1149">
     <Setter Property="FontWeight" Value="Bold"/>
     <Setter Property="Foreground" Value="Green"/>
 </DataTrigger>

如何将“1149”替换为MaxTagCount

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您正在寻找一种方法将Value的{​​{1}}绑定到您的DataTrigger财产,由于这一事实,这是不可能的MaxTagCount不是依赖属性。

最常见的解决方法是将Value属性和MaxTagCount属性都传递给Count,转换器将比较这两个值并返回true或false。现在MultiValueConverter的作用是检查转换器返回的值:

首先,定义一个比较两个值的基本转换器,如下所示:

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

请注意,我使用<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值,因为它(很可能)在全局UI MaxTagCount上定义(在这种情况下,主窗口是命名的DataContext),您也可以使用Main绑定。

答案 1 :(得分:1)

正如@Elhamer已经解释的那样,你不能绑定到DataTrigger的Value属性,因为它不是依赖属性。

作为使用多转换器的替代方法,您可以向视图模型中添加另一个属性,该属性返回一个bool,指示CountMaxTagCount属性是否相等:

public bool IsMax => Count == MaxCount;

...并绑定到这个:

<DataTrigger Binding="{Binding IsMax}" Value="True">
    <Setter Property="FontWeight" Value="Bold"/>
    <Setter Property="Foreground" Value="Green"/>
</DataTrigger>

毕竟,视图模型只不过是视图的模型,这种逻辑在那里实现是完全合理的。