我对MVVM光明世界很陌生,在搜索后我找不到我想要做的事情。
我的WP7应用程序包含一个数据透视表,每个数据透视表项内容为View1,而viewmodel为VM1。
加载我的应用程序时,我想创建具有相同视图和视图模型但具有不同参数的每个透视图项。
示例:
PivotItem 1 - >将param“car”发送到视图模型 PivotItem 2 - >将param“truck”发送到视图模型等
Google告诉我使用短信,但如果我从MainViewModel发送2封邮件,则PivotItem1和PivotItem2 ViewModel都会收到这些消息。
这种做法我错了吗? 还有另一种解决方案可以成功吗?
提前感谢您的回答。
PS:放纵,英语不是我的母语,请不要犹豫,要求提供更多信息。此致
Aymeric Lagier
答案 0 :(得分:0)
要分隔消息,请使用第二个构造函数签名,您可以传递令牌。这个令牌可以是任何东西,但我通常使用枚举来存储系统中的所有消息类型。 在公共库中创建静态类,并在需要发送或接收消息的所有项目中引用它。
以下代码希望显示这种方法,请注意我在消息中发送一个字符串作为值,但这可以是任何内容,甚至是一个复杂的对象,例如您的业务对象之一。
namespace MyProject.Common
{
public static class AppMessages
{
enum MessageTypes
{
ViewmodelA,
ViewmodelB
}
public static class ViewModelAUpdate
{
public static void Send(string value)
{
Messenger.Default.Send(value, MessageTypes.ViewmodelA);
}
public static void Register(object recipient, Action<string> action)
{
Messenger.Default.Register(recipient, MessageTypes.ViewmodelA, action);
}
}
public static class ViewModelBUpdate
{
public static void Send(string value)
{
Messenger.Default.Send(value, MessageTypes.ViewmodelB);
}
public static void Register(object recipient, Action<string> action)
{
Messenger.Default.Register(recipient, MessageTypes.ViewmodelB, action);
}
}
}
}
答案 1 :(得分:0)
如何使用方法设置要接收的邮件。 (这可以作为构造函数或属性中的参数来完成)
public void RegisterForAppMessage(AppMessages.MessageTypes messageType)
{
switch (messageType)
{
case AppMessages.MessageTypes.PivotViewItem1Message:
AppMessages.PivotViewItem1Message.Register(this,DoSomethingWhenIRecievePivotViewItem1Messages)
break;
case AppMessages.MessageTypes.PivotViewItem2Message:
AppMessages.PivotViewItem2Message.Register(this,DoSomethingWhenIRecievePivotViewItem2Messages)
break;
}
}
private void DoSomethingWhenIRecievePivotViewItem2Messages(string obj)
{
// TODO: Implement this method
throw new NotImplementedException();
}
private void DoSomethingWhenIRecievePivotViewItem1Messages(string obj)
{
// TODO: Implement this method
throw new NotImplementedException();
}
答案 2 :(得分:0)
为此目的,消息听起来有点沉重。你能简单地在ViewModel中注入一个参数吗?如果您已经拥有MVVMLight,那么您也支持SimpleIOC。也许让视图在解析视图时找到它的ViewModel并决定在视图模型上使用哪个参数? 您可以看到它的示例here