MVVM光:从视图中传递对象视图模型 [英] MVVM light: Pass object from view to viewmodel
问题描述
我最近开始使用MVVM光与WPF工作,我有以下的(简单的场景)。
-
主窗口包含的元素列表框
-
当一个人被选中,单击该按钮时,我火了一个命令:
ReservoirViewerCommand.Execute(NULL);
-
在视图模型I类实例化的命令,并与所选对象发送消息:
ReservoirViewerCommand =新RelayCommand(OpenReservoir);
私人无效OpenReservoir()
{
Messenger.Default.Send(新LaunchShowReservoirMessage(){水库= SelectedReservoir});
}
其中:
类LaunchShowReservoirMessage:MessageBase
{
公共水库水库{搞定;组; }
}
-
该MAINVIEW注册信息,并打开一个新的子窗口:
私人无效RegisterMessages()
{
Messenger.Default.Register< LaunchShowReservoirMessage>(这一点,OnLaunchShowReservoir );
}
公共无效OnLaunchShowReservoir(LaunchShowReservoirMessage味精){
变种showReservoir =新ReservoirViewerView();
showReservoir.Show();
}
我需要的是新的视图模型(ReservoirViewerViewModel)能以某种方式通过消息得到传递的对象中保持这样我就可以显示在子窗口中的此对象的详细信息。
我做了一些一步一步的调试和视图模型构造似乎从未达到。
我做了一些一步一步的调试和视图模型构造似乎从未达到。
块引用>
请确保你实际上视图结合使用下列之一的视图模型:
在代码隐藏
VAR showReservoir =新ReservoirViewerView();
showReservoir.DataContext = ViewModelLocator.ReservoirViewerViewModel; //静态属性
// OR = showReservoir.DataContext新ReservoirViewerViewModel();
showReservoir.Show();
在 XAML视图
<窗口x:类=Garmin.Cartography.AdminBucketTools.ChildWindowView
的xmlns =http://schemas.microsoft.com/winfx/2006/ XAML /演示
的xmlns:X =http://schemas.microsoft.com/winfx/2006/xaml
的DataContext ={绑定路径= ReservoirViewerViewModel源= {StaticResource的定位}} >
<! - 使用非静态属性在ViewModelLocator - >
<网/>
< /窗GT;
在的XAML资源
<数据类型的DataTemplate ={X:类型的ViewModels:ReservoirViewerViewModel}>
<访问量:ReservoirViewerView />
< / DataTemplate中>
我需要的是新的视图模型(ReservoirViewerViewModel)能以某种方式通过消息得到传递的对象中保持这样我就可以显示在子窗口中的这个对象的细节。
块引用>
简单在ReservoirViewerViewModel类注册了同样的信息:
Messenger.Default.Register< LaunchShowReservoirMessage>(这一点,(MSG)=> ;
{
变种水库= msg.Reservoir;
});
仅供参考,如果你得到来自GenericMessage<消息类; [内容类型]>而不是MessageBase,然后您可以使用GenericMessage类的已定义的内容属性。例如:
公共类LaunchShowReservoirMessage:GenericMessage<储存器GT;
{
公共LaunchShowReservoirMessage(水库含量):基地(内容){}
}
和则:
Messenger.Default.Register< LaunchShowReservoirMessage>(这一点,(MSG)=>
{
变种水库= msg.Content;
});
I 've recently started working with WPF using MVVM light and I have the following (simple scenario).
MainWindow contains a listbox of elements.
When one is selected and the button is clicked, I fire a command:
ReservoirViewerCommand.Execute(null);
On the viewmodel class I instantiate the command and send a message with the selected object:
ReservoirViewerCommand = new RelayCommand(OpenReservoir); private void OpenReservoir() { Messenger.Default.Send(new LaunchShowReservoirMessage(){Reservoir=SelectedReservoir}); }
where:
class LaunchShowReservoirMessage:MessageBase { public Reservoir Reservoir { get; set; } }
The mainview registers the message and opens a new child window:
private void RegisterMessages() { Messenger.Default.Register<LaunchShowReservoirMessage>(this,OnLaunchShowReservoir); } public void OnLaunchShowReservoir(LaunchShowReservoirMessage msg) { var showReservoir = new ReservoirViewerView(); showReservoir.Show(); }
What I need is that the new ViewModel (ReservoirViewerViewModel) can somehow get hold of the passed object through the message so that I can then display the details of this object on the child window.
I did some step-by-step debugging and the ViewModel constructor seems never to be reached.
解决方案"I did some step-by-step debugging and the ViewModel constructor seems never to be reached."
Make sure that you are actually binding your view to your view model using one of the following:
In CodeBehind
var showReservoir = new ReservoirViewerView(); showReservoir.DataContext = ViewModelLocator.ReservoirViewerViewModel; //static property //OR showReservoir.DataContext = new ReservoirViewerViewModel(); showReservoir.Show();
In Xaml View
<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>
In Xaml Resources
<DataTemplate DataType="{x:Type viewmodels:ReservoirViewerViewModel}"> <views:ReservoirViewerView/> </DataTemplate>
"What I need is that the new ViewModel (ReservoirViewerViewModel) can somehow get hold of the passed object through the message so that I can then display the details of this object on the child window."
Simply register for the same message in your ReservoirViewerViewModel class:
Messenger.Default.Register<LaunchShowReservoirMessage>(this, (msg) => { var reservoir = msg.Reservoir; });
FYI, if you derive your message class from GenericMessage<[content type]> instead of MessageBase, then you can use the already-defined Content property of the GenericMessage class. For example:
public class LaunchShowReservoirMessage: GenericMessage<Reservoir> { public LaunchShowReservoirMessage(Reservoir content) : base(content) { } }
And then:
Messenger.Default.Register<LaunchShowReservoirMessage>(this, (msg) => { var reservoir = msg.Content; });
这篇关于MVVM光:从视图中传递对象视图模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!