MVVM - 在视图中显示来自多个模型实体的消息

MVVM - Display messages from multiple model entities in the view

下午好,

在我的项目中,我有一个包含列表视图对象的视图。现在我有一个名为 ControlUnit 的 class(模型)需要向视图报告其进度。大多数时候,在给定时间会有多个 ControlUnit 对象。

例如,在我的视图模型中,我将为列表中的每个 ControlUnit 对象调用 ControlUnit.DoWork(),当这项工作完成后,我希望每个单元都添加到列表视图中看起来像这样的消息:“01/04/2015 16:00:00 - ControlUnit1 完成工作。”

我是 MVVM 的新手,实际上我正在改造一个旧的 winforms 应用程序,我在一段时间内回到 MVVM 作为练习的一种方式。在 WinForms 中,我刚刚引发了一个具有 "message" 属性 的事件,并在表单本身的代码中处理了它。

public class ControlUnit()
{
public string IpAddress {get;set;}
public string RootPassword {get;set;}

public void DoWork()
{
//Run some telnet commands
//Report result to View (in listview)
//Let's say I run a "uptime" command, I want to return the result of that command and display it in the listview in my view.
}
}

public class DataCollectorViewModel()
{
private List<ControlUnit> _unitList;

public void StartLogging()
{
_unitList.Add(new ControlUnit(IpAddress1,RootPassword1);
_unitList.Add(new ControlUnit(IpAddress2,RootPassword2);
_unitList.Add(new ControlUnit(IpAddress3,RootPassword3);

foreach (ControlUnit cu in _unitList)
{
cu.DoWork();
}

}

}

如有任何帮助,我们将不胜感激。

您需要创建一个对象来保存消息列表,然后将该对象传递给您想要显示消息的每个视图模型。然后在您的 UI 中,您应该像这样绑定到该消息列表:

public interface IMessageHandler
{
    void SendMessage(string msg);
}

public class MessageHandler : IMessageHandler
{
    public ObservableCollection<string> Messages { get; set; }
    public void SendMessage(string msg)
    {
        App.Current.Dispatcher.BeginInvoke(new Action(() => Messages.Add(msg)));
    }
}

public class ViewModel1 
{
    private readonly IMessageHandler _messageHandler;

    public ViewModel1(IMessageHandler messageHandler)
    {
        _messageHandler = messageHandler;
    }
}

public class ViewModel2 
{
    private readonly IMessageHandler _messageHandler;

    public ViewModel2(IMessageHandler messageHandler)
    {
        _messageHandler = messageHandler;
    }
}

您的主要应用程序视图模型需要实例化 MessageHandler class 并传递它,以便每个人都有相同的实例。在您看来,您应该绑定到 Messages 集合。为了使其更加优雅,您还可以使用 IOC 容器。