将 DataTrigger `Value` 绑定到 `V Model`

Posted

技术标签:

【中文标题】将 DataTrigger `Value` 绑定到 `V Model`【英文标题】:Binding DataTrigger's `Value` to `VModel` 【发布时间】:2018-07-29 05:09:02 【问题描述】:

我的 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

【问题讨论】:

【参考方案1】:

如果我对您的理解正确,您正在寻找一种将DataTriggerValue 绑定到您的MaxTagCount 属性的方法,这是不可能的,因为Value 不是依赖属性。

最常见的解决方法是将MaxTagCount 属性和Count 属性都传递给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 绑定来获取 MaxTagCount 值,因为它(很可能)在全局 UI DataContext 上定义(在这种情况下,主窗口被命名为 Main),你也可以使用RelativeSource 绑定。

【讨论】:

【参考方案2】:

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

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

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 事件?

以上是关于将 DataTrigger `Value` 绑定到 `V Model`的主要内容,如果未能解决你的问题,请参考以下文章

将 DataTrigger 绑定到复选框的 IsChecked 属性

wpf datatrigger绑定到方法

绑定属性上的 DataTrigger

DataTrigger

DataTrigger

多值绑定文本块 DataTrigger 未触发