比较 DataTrigger 中的两个动态值

comparing two dynamic values in DataTrigger

我想比较两个动态值 User_iduser_id 是否相等,并设置一个 属性 Cursor。另外,当光标在手上时,我必须执行一个功能。怎么做?这是我正在使用的代码:

<DataTrigger Binding="{Binding Path=User_id}" Value="{Binding Path=user_id}">
  <Setter Property="Cursor" Value="Hand"/>
</DataTrigger>

有几个选项可以解决这个问题。

#1。多重绑定转换器

您可以使用Multibinding将两个值输入一个IMultiValueConverter。要在 DataTrigger 中使用这种类型的绑定,您需要使用以下语法。

<DataTrigger Value="True">
     <DataTrigger.Binding>
         <MultiBinding>
             <MultiBinding.Converter>
                 <local:EqualityConverter />
             </MultiBinding.Converter>
             <Binding Path="User_id" />
             <Binding Path="user_id" />
         </MultiBinding>
     </DataTrigger.Binding>
     <Setter Property="Window.Cursor" Value="Hand"/>
</DataTrigger>

MultiBinding.Converter 设置为 EqualityConverter 的新实例,它是我创建的实现 IMultiValueConverter 接口的 class。 class 将为您进行比较。当此转换器 returns 为真时 DataTrigger 触发。

public class EqualityConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values.Length < 2)
            return false;

        return values[0].Equals(values[1]);

    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

#2。 MVVM 模式

我不确定您的 DataContext 来自哪里,但如果可能,您可能需要考虑使用视图模型进行绑定。视图模型可以公开一个 属性 来为您进行相等性比较。像这样。

   public class UserViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private int _User_id;
    private int _user_id;

    public int User_id
    {
        get
        {
            return _User_id;
        }
        set
        {
            if (_User_id != value)
            {
                _User_id = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("User_id"));
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IsUserIdsEqual"));
                DoSomething();
            }
        }
    }
    public int user_id
    {
        get
        {
            return _user_id;
        }
        set
        {
            if (_user_id != value)
            {
                _user_id = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("user_id"));
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IsUserIdsEqual"));
                DoSomething();
            }
        }
    }

    public bool IsUserIdsEqual
    {
        get { return _user_id == _User_id; }
    }

    private void DoSomething()
    {
        if (this.IsUserIdsEqual)
        {
            //Do something when they are equal.
        }
    }

}

如果使用这样的视图模型,您的 DataTrigger 可以简化为..

<DataTrigger Binding="{Binding Path=IsUserIdsEqual}" Value="True">
    <Setter Property="Window.Cursor" Value="Hand"/>
</DataTrigger>

关于在触发器上执行函数,我添加了一个 DoSomething 方法来强调当两个 ID 相等时如何使用视图模型来执行函数。我不确定这是否适用于您的情况,因为我不确定函数调用的目的是什么,但这是一种在条件更改时执行函数的方法。