让ViewModel知道View的通用对象。

17 浏览
0 Comments

让ViewModel知道View的通用对象。

我有一个通用视图,其中我将某个特定视图“注入”到一个包含的ContentControl中(我通过以下帮助创建了该功能 -> 帮助1 - 帮助2)。

我的视图的基本源代码如下:

MyGenericView.xaml


    
        
    
    
        
    

CustomerView.xaml


    
        
            
    

Crud.xaml:一个资源字典,我用它来“解决”显示哪个视图,取决于通用视图提供的MyObject对象的DataType


    
        
    
    
        
    
    ...

它工作得很好。我可以通过“特定”视图(客户、产品等)来管理MyObject

好吧。这就是我的问题:

所有特定的视图都有自己的ViewModels,并且当然会管理各自视图的数据。但是,我不知道(在ViewModel中)我正在处理的对象(MyObject)是什么,因为通用视图将其提供给特定视图,而不是ViewModel。

有没有办法让特定视图的ViewModels知道正在“指挥”视图的对象?

0
0 Comments

在MVVM Light中,可以使用发布者/订阅者模式的广播消息来与“托管”视图模型通信,而无需在“托管”控件中具有对“托管”控件的硬引用。这使得“托管”控件能够保持与“托管”控件解耦,同时在两者之间进行通信。

在MVVM Light中,有一个名为messenger的对象,它可以为您处理很多细节。您可以创建消息类,将不同的消息和它们发送的参数分开。您还可以指定一个“Token”,它只是一个特定的字符串(我通常在一个类中设置一组常量来存储各种“Token”),它只允许订阅者和该Token接收消息。下面是我在MVVM Light中使用的代码示例,在MVVM Light的v3中,您需要确保从消息中注销,因为它不使用弱事件模式。

如果您不想使用MVVM Light,您可以在您的发布者/订阅者模型中使用相同的思路,只是需要自己确定发布者发送的Token是否是订阅者正在寻找的Token。

public static class DescriptiveMessageName
{
    public static void Send(object args)
    {
        Messenger.Default.Send(args, "SpecificToken");
    }
    public static void Send(object args, string token)
    {
        Messenger.Default.Send(args, token);
    }
    public static void Register(object recipient, Action action)
    {
        Messenger.Default.Register(recipient, "SpecificToken", action);
    }
    public static void Register(object recipient, string token, Action action)
    {
        Messenger.Default.Register(recipient, token, action);
    }
    public static void UnRegister(object recipient)
    {
        Messenger.Default.Unregister(recipient);
    }
    public static void UnRegister(object recipient, Action action)
    {
        Messenger.Default.Unregister(recipient, action);
    }
}

我已经考虑过使用“发布者/订阅者”方法。不同的实例是否会混淆哪个是正确的对象呢?你能在答案中插入一个示例吗?非常感谢。

嗯,我已经在我的项目中使用了MVVMLight。我将尝试使用它提供的“messenger对象”。谢谢。

0