Проблема с INotifyPropertyChanged

347
31 июля 2017, 10:47

Есть интерфейс 1:

public interface IService 
{
   string TextString {get;set;}
}

Есть класс 1 реализющий это интерфес 1:

public class TextClass : IService, INotifyPropertyChanged  
{
   private string _textString ;
   public string TextString
   {
      get => _textString;
      set { _textString = value;
             OnPropertyChanged();    
          }
   }
   public TextClass { _textString = "XXXXX";}
  // Классическая реализация INotifyPropertyChanged
  // .....
}

Есть еще интерфес 2:

public interface IDataService<T> 
{
  T : TextClassLocal
}

Есть класс 2 реализующий интерфейс 2:

public class DataService :IDataService<TextClass> 
{
  private TextClass _textClassLocal = new TextClass()
  public TextClass : TextClassLocal 
  {
   get => _textClassLocal;
   set { _textClassLocal = value }
  }
}

Есть ViewModel:

public class MainViewModel : INotifyPropertyChanged
{
  private _dataServise = new  DataService();
  private string _textMessage
  public string TextMessage 
  { 
    get => _dataService.TextClassLocal.TextString;
    set {
          _dataService.TextClassLocal.TextString = value;
          OnPropertyChanged();
    }
  }

  // Классическая реализация INotifyPropertyChanged
  // .....
}

Усть View в котором :

<TextBlock Text={Binding TextMessage} />

Во View DataContext привязан и при запуске в TextBlock отображается правильное "XXXX"

А вот теперь самое интересное, во всяком случае для меня ;)

Если во ViewModel сделать операцию: TextString = "UUUU"; то Text в TextBlock соотоветственно изменится на UUUU. Все ОК!

Однако если сделать напрямую: _dataService.TextClassLocal.TextString = "UUUU"; то ни каких изменений не произойдет ;( В чем может быть проблема? Как от нее избавиться? В боевой реализации в классе TextClass реализуется Event который обновляет TextString и эти изменения ни как не отображаются в TextBlock

Answer 1

Так в вашей вм TextString или TextMessage ? В коде одно, в описании другое... Если TextMessage, то ваш TextBlock слушает эту проперти (т.е. TM), при изменении которого инициируется событие PropertyChanged. А так вы меняете приватный филд, который никем не прослушивается. Поэтому и результата никакого

Answer 2

Для того, что бы пользовательский интерфейс узнавал об изменении привязанных свойств WPF предоставляет интерфейс INotifyPropertyChanged, который путем вызова PropertyChanged сообщает клиенту что значение свойства изменилось.

В первом варианте

public string TextMessage 
{ 
    get => _dataService.TextClassLocal.TextString;
    set 
    {
         _dataService.TextClassLocal.TextString = value;
         OnPropertyChanged();
    }
 }

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

В случае вызова

_dataService.TextClassLocal.TextString = "новое значение";

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

Для того что бы пользовательский интерфейс обновил значение свойства TextMessage после того как вы напрямую измените значение _dataService.TextClassLocal.TextString можно вызывать метод OnPropertyChanged() и в качестве параметра передать ему имя свойства, значение которого необходимо обновить.

_dataService.TextClassLocal.TextString = "новое значение";
OnPropertyChanged("TextMessage");
READ ALSO
Дублируются данные в шаблонах списка ListView

Дублируются данные в шаблонах списка ListView

Разрабатывается чат вконтакте, который поддерживает медиавложенияБыл написан обращённый список ListView, поддерживающий виртуализацию данных...

317
как передать static файл через koa-router

как передать static файл через koa-router

Мне нужно, чтобы переходя на любой роут моего приложения koa всегда передавал файл indexhtml, т

327
draggable jquery etc

draggable jquery etc

имеется ту ду лист, создается заметка, которая в формате li#draggable > p добавляется в ul в колонку PENDINGхочу реализовать drag&drop, чтобы заметки из колонки...

278