mrMercury
Поскольку мне нужно было решить подобную головоломку, я дал ей немного, хотя и вот что я придумал: вы можете сделать это с привязкой вместо события, я бы использовал службу для получения сообщений, это отличается от вашей службы WCF, служба в MVVM-это класс, который делает что-то для ViewModel, таким образом, ViewModel не нужно знать, как сообщения попадают к нему, они просто делают, давайте посмотрим некоторый код:
служба WCF:
public class MessagesWFCService : IMessagesWFCService
{
public void SendMessage(string message)
{
MessageService.Instance.AddMessage(message);
}
}
Служба:
public interface IMessageService
{
void AddMessage(string message);
}
public class MessageService : IMessageService
{
private static MessageService _Instance = null;
private MessageViewModel _MessageViewModel = null;
private ServiceHost _ServiceHost = null;
public MessageService()
{
_Instance = this;
_ServiceHost = new ServiceHost(typeof(MessagesWFCService));
}
public void AddMessage(string message)
{
_MessageViewModel.Messages.Add(message);
}
public void Close()
{
_ServiceHost.Close();
}
public static MessageService Instance
{
get
{
return _Instance;
}
set
{
if(_Instance != value)
_Instance = value;
}
}
public MessageViewModel MessageViewModel
{
get
{
return _MessageViewModel;
}
set
{
if(_MessageViewModel != value)
_MessageViewModel = value;
}
}
public void Open()
{
_ServiceHost.Open();
}
}
модель представления
public class MessageViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private ObservableCollection<string> _Messages = null;
private IMessageService _MessageService = null;
public MessageViewModel()
{
_MessageService = new MessageService();
_MessageService.MessageViewModel = this;
_MessageService.Open();
}
public ObservableCollection<string> Messages
{
get
{
return _Messages;
}
set
{
if(_Messages != value)
{
_Messages = value;
PropertyChangedEventHandler eventHandler = PropertyChanged;
if(eventHandler != null)
eventHandler(this, new PropertyChangedEventArgs("Messages"));
}
}
}
}
Конечно, вам нужно будет установить DataContext представления в ViewModel и привязать свойство ItemsSource элемента управления к свойству Messages ViewModel.
Если вы используете
Призма или Единство вы должны использовать контейнер для разрешения Службы MessageService вместо непосредственного создания экземпляра.
Взгляните, имейте в виду, что я еще не проверял это, но я сделаю это, и я думаю, что это может дать вам некоторые рекомендации.