2015-03-25 2 views
0

Вопрос: У меня есть две модели, которые используют службу со списком. Мой вопрос заключается в том, как настроить уведомление, чтобы оба режима просмотра знали, когда этот список изменен. Описание ниже и код, где я нахожусь.Множественные режимы просмотра, совместно использующие услугу с уведомлением

Я нашел этот пример HERE, который выглядит правильно для того, что я пытаюсь сделать, но у меня есть вопрос относительно того, как быть уведомленным в моих моделях изменения моего сервиса. Я добавлю код, который я издевался, чтобы узнать, правильно ли я нахожусь. Я использую WPF/MVVM Light.

Первая часть - это сервис с интерфейсом, который будет иметь список данных, в этом примере я использую список строк. Я хочу, чтобы свойство в обеих моделях просмотра имело доступ к этому списку данных и уведомлялось, когда оно было изменено. Я думаю, что меня бросает интерфейс IOC в мои модели просмотра. Я все больше понимаю, почему это хорошо, но я все еще обдумываю его, и я не уверен, как настроить уведомление, когда список изменен в службе. Если моя служба не была введена, я мог бы установить событие или свойство, к которому мое свойство viewmodel будет иметь доступ к get/set, но при инъекции моей службы не отображаются мои общедоступные поля, а только методы. Это ново для меня, поэтому очень вероятно, что я не понимаю это правильно или что-то не хватает.

Я использовал список в своей службе вместо ObservableCollection на основе некоторого чтения, которое я сделал, предупреждая об использовании ObservableCollection здесь. Спасибо вам за любую помощь.

public class MyService : IMyService 
{ 
    private List<string> myList = new List<string>(); 

    public List<string> getMyList() 
    { 
     return this.myList; 
    } 
    public void setMyList(List<string> value) 
    { 
     this.myList = value; 
    } 
    public void addValue(string value) 
    { 
     this.myList.Add(value); 
    } 
    public void insertValue(int index, string value) 
    { 
     this.myList.Insert(index, value); 
    } 
} 

public class MyViewModelOne : ViewModelBase 
{ 
    private readonly IMyService myService; 

    public MyViewModelOne(IMyService myService) 
    { 
     this.myService = myService; 
    } 

    public List<string> MyProperty // control item source will bind to this 
    { 
     get 
     { 
      return this.myService.getSource(); 
     } 
    } 
    public void setSomeValue(value) 
    { 
     this.myService.addValue(value); 
    } 
} 

public class MyViewModelTwo : ViewModelBase 
{ 
    private readonly IMyService myService; 

    public MyViewModelTwo(IMyService myService) 
    { 
     this.myService = myService; 
    } 

    public List<string> MyProperty // control item source will bind to this 
    { 
     get 
     { 
      return this.myService.getSource(); 
     } 
    } 
    public void setSomeValue(value) 
    { 
     this.myService.addValue(value); 
    } 
} 
+0

Так что это вопрос? –

+0

Я не знаю, как обращаться с уведомлением. Скажите, что viewmodelone меняет список в сервисе, как он будет знать об этом? Общие данные, но используются разные в каждой модели. - Попробуйте изменить слово выше, чтобы сделать вопрос более понятным. – Terco

+2

Не обеспечивает ли MVVM Light систему обмена сообщениями? – Aybe

ответ

2

я получил эту работу два различных способа, я пошел с первым примером, потому что я думаю, что легче следовать в коде.

Это произошло из-за того, что у меня был элемент управления в моем mainview с соответствующим кодом, который рос, и я понял, что мне нужен один и тот же элемент управления/поведение в отдельном представлении, которое будет использовать те же данные/элемент управления для другой цели. Я не хотел дублировать этот элемент управления/шаблон/код в двух местах, поэтому я включил его в User Control. Затем я вставляю пользовательский элемент управления в свои представления. У пользовательского элемента управления есть собственная виртуальная машина. Основной вид обновляет службу новыми данными, а вложенный элемент управления прослушивает событие, чтобы знать, когда появляются новые данные.

Все еще очень новы для мышления MVVM, поэтому, пожалуйста, не стесняйтесь указывать на проблемы с любым из этих примеров.

Пример использования службы с обработчиком событий.

public interface IMyInterface 
{ 
    event EventHandler OnSomeEvent; 
    void addSomeData(string value); 
    void getSomeData(); 
} 

public class MyInterface: IMyInterface 
{ 
    public event EventHandler OnSomeEvent = delegate { }; 

    public void addSomeData(string value) 
    { 
     // do stuff 
     OnSomeEvent(); 
    } 
    public string getSomeData() 
    { 
     return "some data"; 
    } 
} 

// Main ViewModel 
public class ViewModelOne : ViewModelBase 
{ 
    IMyInterface myInterface; 
    public NotifyViewModel(IMyInterface myInterface) 
    { 
     this.myInterface = myInterface; 
     this.myInterface.OnItemSourceChanged += myInterface_OnSomeEvent; 
    } 

    void testEvent() 
    { 
     this.myInterface.addSomeData("test data"); 
    } 
} 

// My nested user control 
public class ViewModelTwo : ViewModelBase 
{ 
    IMyInterface myInterface; 
    public NotifyViewModel(IMyInterface myInterface) 
    { 
     this.myInterface = myInterface; 
     this.myInterface.OnItemSourceChanged += myInterface_OnSomeEvent; 
    } 

    void myInterface_OnSomeEvent(object sender, System.EventArgs e) 
    { 
     // do stuff 
    } 
} 

Пример использования MVVM Light Сообщения

public class EventDataSource 
{ 
    public string MyItemSource { get; set; } 
    public EventDataSource() 
    { 
     MyItemSource = string.Empty; 
    } 

} 

// Message class 
public class MyDataSourceMessage : MessageBase 
{ 
    public EventDataSource MyItemSource { get; set; } 
    public MyDataSourceMessage(EventDataSource myItemSource) 
    { 
     MyItemSource = myItemSource; 
    } 
} 

// Main ViewModel 
public class ViewModelOne : ViewModelBase 
{ 
    public NotifyViewModel() {} 

    void testMessage() 
    { 
     EventDataSource msg = new EventDataSource() { MyItemSource = "magic message!"}; 
     Messenger.Default.Send(new MyDataSourceMessage(msg as EventDataSource)); 
    } 
} 

// My nested user control 
public class ViewModelTwo : ViewModelBase 
{ 

    public NotifyViewModel() 
    { 
     Messenger.Default.Register<MyDataSourceMessage>(this, (action) => ReceiveMessage(action)); 
    } 

    private ObservableCollection<string> myProperty = new ObservableCollection<string>(); 
    public ObservableCollection<string> MyProperty 
    { 
     get { return myProperty; } 
     set 
     { 
      myProperty: = value; 
      RaisePropertyChanged(() => MyProperty); 
     } 
    } 
    void ReceiveMessage(MyDataSourceMessage action) 
    { 
     // do something with the data 
     MyProperty.Add(action.DGItemSource.ItemSource); 
    } 
} 
1

Хорошо, позвольте мне попытаться пролить свет на это. Прежде всего, уведомление об изменении не предназначено для передачи информации между моделями просмотра, оно предназначено для уведомления самого представления о том, что свойство модели просмотра изменилось.

Есть несколько методов для просмотра моделей в выдаче уведомлений об изменениях на мнения:

  1. INotifyPropertyChanged интерфейс
  2. INotifyCollectionChanged интерфейс
  3. пользовательское событие с именем свойства с суффиксом Changed (например, мероприятие под названием MyPropChanged за объект, получивший название MyProp)

Сказав все это, все еще возможно, чтобы одна модель представления подписалась на события, генерируемые вышеуказанными методами, и если вам действительно нужно, вы можете, конечно.

EDIT:

Проверить это link для описания по пункту номер 3 выше.

+0

Спасибо, я прочитаю эти варианты. Я ищу хороший способ справиться с этим, мне не нужно работать так, как мои первоначальные вопросы. – Terco

2

Из-за того, что я понял о вашей проблеме, в основном вам нужна ваша реализация INotifyPropertyChanged на вашем уровне обслуживания, а список списка - это ObservableCollection, который вводится из службы.

Теперь, если есть изменение уведомления, это будет непосредственно на службе, и, следовательно, нет явной необходимости в обработке.

Ваше связывание может выглядеть "{Binding MyService.MyProperty}"

+0

Спасибо. У меня есть решение, в котором я доволен, но это хорошая информация. – Terco

Смежные вопросы