C# 绑定数据触发器';s`Value`to`VModel`

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="

我的Vmodel中有一个int值:

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
值,因为它(很可能)是在全局UI
DataContext
上定义的(在本例中,主窗口名为
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事件?