Есть интерфейс 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");
Продвижение своими сайтами как стратегия роста и независимости