我使用消息傳遞服務在ViewModels之間進行通信,同時仍然保持它們的解耦。如果您使用的是MVVMLight,則附帶一個。我不想使用MVVM框架,並編寫我自己的消息服務。這是一個從最近的一個項目的例子:
public class MessageService : IMessageService
{
private List<IMessageSubscription> subscribers; //list of subscription objects registered
public MessageService()
{
subscribers = new List<IMessageSubscription>();
}
public void Subscribe<T>(string message, Action<T> action)
{
subscribers.Add(new MessageSubscription<T>()
{
Message = message,
MessageActionWithArgs = action
});
}
public void Subscribe(string message, Action action)
{
subscribers.Add(new MessageSubscription<bool>()
{
Message = message,
MessageActionNoArgs = action
});
}
public void Send<T>(string message, T args)
{
IEnumerable<IMessageSubscription> matches = subscribers.Where(x => x.Message == message && x.PayLoadType == typeof(T));
foreach (IMessageSubscription sub in matches.ToList())
{
sub.InvokeMessageAction((T)args);
}
}
public void Send(string message)
{
IEnumerable<IMessageSubscription> matches = subscribers.Where(x => x.Message == message);
foreach (IMessageSubscription sub in matches.ToList())
{
sub.InvokeMessageAction();
}
}
}
因此,例如,MainViewModel會聽的消息,如「ActiveViewModelChangeRequest」,而當他們需要變得活躍等的ViewModels將發送該消息。所以,在MainViewModel你有這樣的事情:
public MainViewModel()
{
messageService.Register<ViewModelBase>("ActiveViewModelChangeRequest", UpdateActiveViewModel);
}
private void UpdateActiveViewModel(ViewModelBase viewModel)
{
this.CurrentVM = viewModel;
}
然後在UserListVM你會:
private void OnUserSelect(object sender, UserSelectionEventArgs e)
{
UserVM viewModel = new UserVM(SelectedUser);
messageService.Send<ViewModelBase>("ActiveViewModelChangeRequest, viewModel);
}
有大量的閱讀材料,可對MVVM應用的使者模式。我建議讀一下這個。
您需要通過某種方式告知'MainWindowViewModel'將視圖更改爲Detail的視圖。您只能使用一個'CurrentViewModel'屬性來設置'UserList'或'User'視圖模型。視圖將由DataTemplate根據ViewModel的類型決定 – Fabio
這就是我想要弄清楚的。沒有父佈局(我不想使用),我還沒有找到一種方法告訴MainWindowVM從當前視圖更新它的CurrentViewModel。消息服務也許是我需要的。 – tab87vn
消息或事件的方法都將是你的案例中足夠好的解決方案 – Fabio