Есть интерфейс 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
Так в вашей вм TextString или TextMessage ? В коде одно, в описании другое... Если TextMessage, то ваш TextBlock слушает эту проперти (т.е. TM), при изменении которого инициируется событие PropertyChanged. А так вы меняете приватный филд, который никем не прослушивается. Поэтому и результата никакого
Для того, что бы пользовательский интерфейс узнавал об изменении привязанных свойств 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");
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Разрабатывается чат вконтакте, который поддерживает медиавложенияБыл написан обращённый список ListView, поддерживающий виртуализацию данных...
Мне нужно, чтобы переходя на любой роут моего приложения koa всегда передавал файл indexhtml, т
имеется ту ду лист, создается заметка, которая в формате li#draggable > p добавляется в ul в колонку PENDINGхочу реализовать drag&drop, чтобы заметки из колонки...