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 容器。
下午好,
在我的项目中,我有一个包含列表视图对象的视图。现在我有一个名为 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 容器。