2

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

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

  2. 选择一个并单击按钮时,我发出命令:

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

    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 构造函数。

4

2 回答 2

0

我不是 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... } ...
于 2012-09-19T20:45:17.007 回答
0

“我做了一些逐步调试,但似乎永远无法访问 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<[content type]> 而不是 MessageBase 派生消息类,则可以使用 GenericMessage 类的已定义 Content 属性。例如:

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

接着:

Messenger.Default.Register<LaunchShowReservoirMessage>(this, (msg) =>
{
    var reservoir = msg.Content;
});
于 2012-09-19T22:15:07.460 回答