【问题标题】:MVVM light: Pass object from view to viewmodelMVVM 灯光:将对象从视图传递到视图模型
【发布时间】:2012-07-22 15:43:59
【问题描述】:

我最近开始使用 MVVM light 处理 WPF,我有以下(简单场景)。

  1. MainWindow 包含一个元素列表框。

  2. 当一个被选中并单击按钮时,我会触发一个命令:

    ReservoirViewerCommand.Execute(null);
    
  3. 在视图模型类上,我实例化命令并发送带有所选对象的消息:

    ReservoirViewerCommand = new RelayCommand(OpenReservoir);
    private void OpenReservoir()
    {
        Messenger.Default.Send(new LaunchShowReservoirMessage(){Reservoir=SelectedReservoir});          
    }
    

    地点:

    class LaunchShowReservoirMessage:MessageBase
    {
        public Reservoir Reservoir { get; set; }
    }
    
  4. 主视图注册消息并打开一个新的子窗口:

    private void RegisterMessages() 
    {
        Messenger.Default.Register<LaunchShowReservoirMessage>(this,OnLaunchShowReservoir);
    }
    
    public void OnLaunchShowReservoir(LaunchShowReservoirMessage msg) {
        var showReservoir = new ReservoirViewerView();
        showReservoir.Show(); 
    }
    

我需要的是新的 ViewModel (ReservoirViewerViewModel) 可以通过消息以某种方式获取传递的对象,以便我可以在子窗口上显示该对象的详细信息。

我进行了一些逐步调试,但似乎永远无法访问 ViewModel 构造函数。

【问题讨论】:

    标签: c# mvvm mvvm-light


    【解决方案1】:

    “我进行了一些逐步调试,但似乎永远无法访问 ViewModel 构造函数。”

    确保使用以下方法之一将视图实际绑定到视图模型:

    在代码隐藏

    var showReservoir = new ReservoirViewerView();
    showReservoir.DataContext = ViewModelLocator.ReservoirViewerViewModel; //static property
    //OR showReservoir.DataContext = new ReservoirViewerViewModel();
    showReservoir.Show();
    

    在 Xaml 视图中

    <Window x:Class="Garmin.Cartography.AdminBucketTools.ChildWindowView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
        DataContext="{Binding Path=ReservoirViewerViewModel, Source={StaticResource Locator}}">
        <!--Use the non-static property in your ViewModelLocator-->
    
        <Grid />
    </Window>
    

    在 Xaml 资源中

    <DataTemplate DataType="{x:Type viewmodels:ReservoirViewerViewModel}">
        <views:ReservoirViewerView/>
    </DataTemplate>
    

    “我需要的是新的 ViewModel (ReservoirViewerViewModel) 可以通过消息以某种方式获取传递的对象,以便我可以在子窗口上显示该对象的详细信息。”

    只需在您的 ReservoirViewerViewModel 类中注册相同的消息:

    Messenger.Default.Register<LaunchShowReservoirMessage>(this, (msg) =>
    {
        var reservoir = msg.Reservoir;
    });
    

    仅供参考,如果您从 GenericMessage 而不是 MessageBase 派生消息类,则可以使用 GenericMessage 类的已定义 Content 属性。例如:

    public class LaunchShowReservoirMessage: GenericMessage<Reservoir>
    {
        public LaunchShowReservoirMessage(Reservoir content) : base(content) { }
    }
    

    然后:

    Messenger.Default.Register<LaunchShowReservoirMessage>(this, (msg) =>
    {
        var reservoir = msg.Content;
    });
    

    【讨论】:

    • 我们什么时候用对象发送这个消息?
    • @Neha,请参阅 OP 问题中的步骤 2 和 3。
    【解决方案2】:

    我不是 MVVM 专家,但是当我想导航到新视图以在单击 ListBox 项后显示某些内容时,我会在我想在这个新视图中显示的对象中发送一条新消息,然后我导航到。我写这篇文章是因为我认为您的方法有点复杂,但是我是一名 Windows Phone 应用程序开发人员,因此请相应地接受此评论。

    无论如何,消息的第一个功能是允许通过视图模型进行通信,因此我认为您应该在 ReservoirViewerViewModel 中注册消息,并在此处使用 msg.Reservoir 获取 Reservoir“附件”。

    在 ReservoirViewerViewModel 中:

    private void RegisterMessages() 
    {
        Messenger.Default.Register<LaunchShowReservoirMessage>(this, ReservoirReceived);
    }
    
    private void ReservoirReceived(LaunchShowReservoirMessage msg) {
        this.LocalReservoir = msg.Reservoir;
    }
    
    public Reservoir LocalReservoir { get... set... } ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多