将 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】:如果我对您的理解正确,您正在寻找一种将DataTrigger
的Value
绑定到您的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 属性,因为它不是依赖属性。
作为使用多转换器的替代方法,您可以向视图模型添加另一个属性,该属性返回一个布尔值,指示 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 事件?以上是关于将 DataTrigger `Value` 绑定到 `V Model`的主要内容,如果未能解决你的问题,请参考以下文章