2401_83929821 2024-10-08 19:51 采纳率: 25%
浏览 13
已结题

我想在WPF的Model Code中获取ViewModel Code中的一个参数

我想在WPF的Model Code中获取ViewModel Code中的一个参数,请问有什么方式可以实现,最好是比较简单且满足MVVM架构。主要是需要实现在ViewMode Code中动态修改View中Datagrid某一列列宽

  • 写回答

30条回答 默认 最新

  • 阿里嘎多学长 2024-10-08 19:51
    关注
    获得0.15元问题酬金

    AIGC生成:


    MVVM架构下WPF Model Code获取ViewModel Code参数

    在MVVM架构下,Model Code通常不应该直接访问ViewModel Code,因为这会破坏MVVM的分层结构。然而,如果你确实需要在Model Code中获取ViewModel Code中的参数,可以使用以下方法:

    1. 使用EventAggregator EventAggregator是一个松耦合的事件传递机制,可以在Model Code和ViewModel Code之间传递数据。首先,在ViewModel Code中发布事件,然后在Model Code中订阅该事件。
    // ViewModel Code
    public class MyViewModel
    {
        public event EventHandler<MyEventArgs> MyEvent;
    
        public void RaiseMyEvent()
        {
            MyEvent?.Invoke(this, new MyEventArgs { MyParameter = "Hello" });
        }
    }
    
    // Model Code
    public class MyModel
    {
        private readonly IEventAggregator _eventAggregator;
    
        public MyModel(IEventAggregator eventAggregator)
        {
            _eventAggregator = eventAggregator;
            _eventAggregator.GetEvent<MyEventArgs>().Subscribe(OnMyEvent);
        }
    
        private void OnMyEvent(MyEventArgs e)
        {
            // 获取ViewModel Code中的参数
            string myParameter = e.MyParameter;
        }
    }
    
    1. 使用Dependency Injection Dependency Injection是一种设计模式,可以在Model Code和ViewModel Code之间注入依赖关系。首先,在ViewModel Code中注入Model Code,然后在Model Code中获取ViewModel Code中的参数。
    // ViewModel Code
    public class MyViewModel
    {
        public MyModel MyModel { get; set; }
    
        public MyViewModel(MyModel model)
        {
            MyModel = model;
        }
    }
    
    // Model Code
    public class MyModel
    {
        public string GetMyParameter()
        {
            // 获取ViewModel Code中的参数
            return MyViewModel.MyModel.MyParameter;
        }
    }
    
    1. 使用Messenger Messenger是一个简单的事件传递机制,可以在Model Code和ViewModel Code之间传递数据。首先,在ViewModel Code中发送消息,然后在Model Code中接收消息。
    // ViewModel Code
    public class MyViewModel
    {
        public void SendMessage()
        {
            Messenger.Default.Send(new MyMessage { MyParameter = "Hello" });
        }
    }
    
    // Model Code
    public class MyModel
    {
        private readonly IMessenger _messenger;
    
        public MyModel(IMessenger messenger)
        {
            _messenger = messenger;
            _messenger.Register<MyMessage>(OnMyMessage);
        }
    
        private void OnMyMessage(MyMessage e)
        {
            // 获取ViewModel Code中的参数
            string myParameter = e.MyParameter;
        }
    }
    

    这些方法都可以实现Model Code获取ViewModel Code中的参数,但是需要注意的是,这些方法都需要遵守MVVM架构的分层结构。


    评论

报告相同问题?

问题事件

  • 系统已结题 10月16日
  • 修改了问题 10月8日
  • 创建了问题 10月8日

悬赏问题

  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal
  • ¥15 想用@vueuse 把项目动态改成深色主题,localStorge里面的vueuse-color-scheme一开始就给我改成了dark,不知道什么原因(相关搜索:背景颜色)
  • ¥20 OPENVPN连接问题
  • ¥15 flask实现搜索框访问数据库
  • ¥15 mrk3399刷完安卓11后投屏调试只能显示一个设备
  • ¥100 如何用js写一个游戏云存档
  • ¥15 ansys fluent计算闪退