【问题标题】:Attached Behaviours or Interaction.Triggers?附加行为或交互。触发器?
【发布时间】:2012-04-06 14:39:46
【问题描述】:

我正在使用 MVVM 编写 WPF 应用程序,但我对应该使用什么来处理 EventArgs 从 View 到 ViewModel 的自定义路由感到困惑。

我的虚拟机上有一个名为 - CurrentIndex 的属性,在我看来,它绑定到一个控件;

Value="{绑定 CurrentIndex}"

当控件的值发生变化时(即 IndexValueChangedEventArgs),该控件有自己的一组 EventArgs。

我正在尝试了解如何触发此事件并访问我的 ViewModel 的当前状态,以便我可以相应地更新 viewmodel。

我尝试使用 EventTrigger(它调用命令但它绑定到我的 VM,因此我无法从控件中获取自定义事件参数)来执行此操作,并创建了一个附加行为,它使我可以访问自定义 EventArgs 但是与我的虚拟机无关。

我不确定我在模式中做错了什么,我想做的就是将 EventArgs 从 ControlA 获取到可以与我的 VM 交互并相应更​​新的东西中。

谢谢。

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    基本上,您不会将 EventArgs 从 View 路由到 ViewModel,而是使用绑定。

    您的 ViewModel 应该实现 INotifyPropertyChanged。那里有各种样板实现,但自己做并不难,例如

    public class MyViewModel : INotifyPropertyChanged
    {
        #region Implementation of INotifyPropertyChanged
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        #endregion
    
        private void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if(handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    
        private int _currentIndex;
        public int CurrentIndex
        {
            get { return _currentIndex; }
            set
            {
                if (value != _currentIndex)
                {
                    _currentIndex = value;
                    RaisePropertyChanged("CurrentIndex");
                }
            }
        }
    }
    

    现在您的视图将使用您已有的绑定与您的视图模型的更改同步

    Value="{Binding CurrentIndex}"
    

    当然假设视图的 DataContext 设置为您的视图模型的实例。

    【讨论】:

    • 是的,我正在这样做,这非常适合将更改从我的数据推送到 UI。我感兴趣的是在 UI 上处理来自控件的事件。即,我有一个文本框,我连接了 KeyDown 事件,我想访问 KeyEventArgs 中的数据并针对在我的 ViewModel 中运行的代码评估它。对于我的命令参数,我主要传递当前的 {Binding} 上下文,这是我的 VM,但我无权访问事件参数。
    • 我明白了。我不知道你怎么能在 MVVM 中做到这一点。交互触发器无济于事。我对附加行为知之甚少。也许是时候学习了:)
    猜你喜欢
    • 2022-08-19
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多