在DataTrigger中比较两个动态值

14

我想比较两个动态值User_iduser_id是否相等,并设置一个属性Cursor。另外,当光标为手形时,我必须执行一个函数。如何做到这一点?这是我正在使用的代码:

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

28

有几种攻击这个问题的选项。

#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接口的类。这个类将为您执行比较操作。当此转换器返回true时,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相等时使用它来执行函数。我不确定这对您的情况是否有效,因为我不确定函数调用的意图是什么,但这是在条件更改时执行函数的一种方式。


EqualityConverter 应该处理值中的 NULL(value[0]),所以代码应该是 return Equals(values[0], values[1]); - VBWebProfi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接