2016-05-04 7 views
0

Мне нужно выполнить двустороннюю связь с использованием WPF на клиенте, а WCF - между сервером и клиентом. Есть три части:Обновление WPF DataGrid без запуска OnPropertyChanged

  • Пользовательский интерфейс (который пользователь может ввести значения в, вид в шаблоне MVVM)
  • Клиент код позади (модели представления в шаблон MVVM)
  • Удаленный WCF сервер, который говорит с моделью просмотра.

Когда пользователь вводит что-то в пользовательский интерфейс, из-за двусторонней привязки данных WPF значение обновляется в модели представления. Модель view запускает событие OnPropertyChanged. При прослушивании этого события модель просмотра информирует сервер об изменении. ЭТО ОК!

ИСПОЛЬЗОВАНИЕ ДРУГОГО НАПРАВЛЕНИЯ - ПРОБЛЕМА. Если сервер обновляется, я ожидаю, что пользователь сможет увидеть изменение непосредственно в пользовательском интерфейсе. Сервер отправляет данные модели просмотра. Модель просмотра обновляет свойство, так что пользовательский интерфейс может отображать значение. Но при настройке этого свойства он снова запускает событие OnPropertyChanged, и это изменение снова отправляется на сервер. Подумайте об этом так:

public int MyProperty 
{ 
    get 
    { 
     return myProperty; 
    } 
    set 
    { 
     // Essentially, I want to know how to tell when the code enters here from the client typing on the UI, or from the server. 
     myProperty = value; 
     OnPropertyChanged("MyProperty"); 
    } 
} 

public void OnPropertyChanged(string propertyName) 
{ 
    // send this property and its value to the server. 
} 
+1

простая проверка equalty в инкубационных свойств 'множество {если (_propValue == значение) возвращение; ...} 'должен предотвращать возможные циклы. – ASh

+0

Как правило, рекомендуется делать проверку равенства в сеттерах, как упоминает Эш. Принятие событий xxxChanged, когда ничего фактически не изменилось, может вводить в заблуждение. –

+0

Это только решает часть моей проблемы. Если пользователь обновляет клиент из пользовательского интерфейса, который обновляет сервер, это работает нормально. Проблема в том, что сервер обновляет клиент, который отображается в пользовательском интерфейсе. Когда сервер возвращает сообщение клиенту, клиент изменяет свойство и запускает событие OnPropertyChanged для обновления пользовательского интерфейса. Но это же событие также обновляет сервер. Я не могу отделить эти два. – user3685285

ответ

0

Если вы не можете изменить сервер и вы работаете < .Net 4.5 вы, вероятно, придется прибегнуть к рефлексии и исследования стека вызовов. Начиная с .Net 4.5 есть Caller Information methods, которые могут помочь.

Если вы можете изменить сервер, попросите его использовать другой метод, чтобы установить значение, но поднять PropertyChanged для свойства, к которому привязан пользовательский интерфейс.

public int MyProperty 
{ 
    get 
    { 
     return myProperty; 
    } 
    set 
    { 
     // Essentially, I want to know how to tell when the code enters here from the client typing on the UI, or from the server. 
     myProperty = value; 
     OnPropertyChanged("MyProperty"); 
    } 
} 

public void OnPropertyChanged(string propertyName) 
{ 
    // send this property and its value to the server. 
} 

private void OnServerChangedMyProperty(int value) 
{ 
    myProperty = value; 
    OnPropertyChanged("MyProperty"); 
}  

Update - потому что комментарии не могут сделать блоки кода

Скажем, у вас есть 3 свойства: Sum, First и Second. Всякий раз, когда First или Second изменений вам также необходимо обновить Sum. Так сеттер для First выглядит следующим образом:

set 
{ 
    _first = value; 
    _sum = _first + _second; 
    OnPropertyChanged("First"); //Update bindings to First 
    OnPropertyChanged("Sum"); //Update bindings to Sum 
} 

и сеттер для Second выглядит следующим образом:

set 
{ 
    _second = value; 
    _sum = _first + _second; 
    OnPropertyChanged("Second"); //Update bindings to Second 
    OnPropertyChanged("Sum"); //Update bindings to Sum 
} 
+0

Но я могу только обновить интерфейс, установив свойство, к которому он привязан, и затем запускает сообщение на сервер. Я не знаю, как его разделить. – user3685285

+0

@ user3685285 см. Обновление к моему ответу –