Изменение свойства не распространяется на цель привязки (UWP) - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть ViewModel и класс.Они выглядят так:

//viewmodel
public class MyViewModel : ViewModelBase {

    private MyClass myClass;
    public MyClass MyClass{
        get{
            return myClass;
        }
        set{
            this.myClass = value;
            base.OnPropertyChanged();
        }
    }

    private string testString;
    public string TestString{
                get{
            return testString;
        }
        set{
            this.testString = value;
            base.OnPropertyChanged();
        }
    }

    public MyViewModel(){
        this.MyClass = new MyClass();
        this.TestString = "blah, blah, blah"
    }}



//class
    public class MyClass : ViewModelBase{
    private string  myString;
    public string MyString{
        get {
        return myString
        }
        set{
            this.myString = value;
            base.OnPropertyChanged();
        }
    }

    public MyClass (){
        this.MyString = "25";   }}

Базовый класс - ViewModelBase реализует INotifyChange и содержит логику обработчика OnPropertyChanged.У меня есть UserControl, где я хочу привязать значения из MyClass следующим образом:

  <TextBlock Text="{x:Bind  Path=MyViewModel.MyClass.MyString, Mode=TwoWay}"></TextBlock>

Однако это не работает.При инициализации значение связывается правильно, но любое изменение в MyViewModel.MyClass.MyString не отражается в текстовом блоке, текст остается тем же.OnPropertyChange повышается, точка останова в ViewModelBase попадает с измененным значением MyString, но оно как-то не распространяется на texblock.Привязка к простому значению из MyClass работает как шарм, этот текстовый блок обновляется при изменении свойства:

  <TextBlock Text="{x:Bind  Path=MyViewModel.TestString, Mode=TwoWay}"></TextBlock>

Чего мне не хватает?Почему текстовый блок с привязкой к «MyViewModel.MyClass.MyString» не обновляется?

1 Ответ

0 голосов
/ 13 сентября 2018

Я проверил код, который вы предоставили, и не думаю, что с ним есть какие-либо проблемы Однако проблема может быть в коде вашей страницы. Вы случайно не используете это как объявление свойства?

public MyViewModel MyViewModel => new MyViewModel();

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

public MyViewModel MyViewModel { get; } = new MyViewModel();

Вы получите правильное поведение при создании только одного экземпляра при создании страницы.

У меня есть следующий код:

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();            
    }

    public MyViewModel MyViewModel { get; } = new MyViewModel();

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        MyViewModel.MyClass.MyString = "test";
    }
}

А мой простой ViewModelBase:

public class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
...