比较DataTrigger

时间:2016-05-18 14:14:57

标签: wpf data-binding datatrigger

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

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

1 个答案:

答案 0 :(得分:11)

有几种方法可以解决这个问题。

#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相等时视图模型如何用于执行函数。我不确定这是否适用于您的情况,因为我不确定函数调用的意图是什么,但它是一种在条件发生变化时执行函数的方法。