【问题标题】:Binding DataTrigger's `Value` to `VModel`将 DataTrigger `Value` 绑定到 `V Model`
【发布时间】: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

【问题讨论】:

    标签: c# wpf silverlight mvvm


    【解决方案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 事件?
      猜你喜欢
      • 2023-04-08
      • 2018-03-07
      • 2017-07-26
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 2018-03-07
      • 2012-01-09
      相关资源
      最近更新 更多