【问题标题】:comparing two dynamic values in DataTrigger比较 DataTrigger 中的两个动态值
【发布时间】:2016-09-15 02:19:45
【问题描述】:

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

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

【问题讨论】:

    标签: wpf data-binding datatrigger


    【解决方案1】:

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

    #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 接口的类。本课程将为您进行比较。 DataTrigger 在此转换器返回 true 时触发。

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

    【讨论】:

      猜你喜欢
      • 2018-11-03
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      相关资源
      最近更新 更多