Я пытаюсь заставить работать двустороннюю привязку на Textblock с привязкой компиляции x:Bind
Проблема: Даже при установке режима привязки TwoWay и триггера источника PropertyChanged. Не могу заставить его работать. Когда баланс свойств объекта изменяется в коде позади, он не обновляется в пользовательском интерфейсе.
Ниже приведен код.
XAML
<TextBlock x:Name = "Balance"
Text = "{x:Bind classObject.Balance,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
Код позади
private ClassName classObject = new ClassName() { Name = "Foo",Balance = 100 };
public Observable ViewModel { get; } = new Observable();
private void NavLinksList_ItemClick(object sender,ItemClickEventArgs e)
{
classObject = new ClassName() { Name = "Blah",Balance = 10 * new Random().NextDouble() * (50 - 1) + 1 };
}
Наблюдаемый
public class Observable : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void Set<T>(ref T storage, T value, [CallerMemberName]string propertyName = null)
{
if (Equals(storage, value))
{
return;
}
storage = value;
OnPropertyChanged(propertyName);
}
protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
Альтернативное решение
Установите Textblock.Text в коде позади вручную.
Но проблема в том, что событие изменения свойства должно работать и автоматически обновлять текстовый блок без явного кодирования.
Я искал другие вопросы, но не нашел похожего.
>> «Но проблема в том, что событие изменения свойства должно работать и автоматически обновлять текстовый блок без явного кодирования».
свойство class такое же, поэтому я думаю, что должно. не так ли?
Кто бы ни проголосовал против вопроса, объясните, пожалуйста, голосование против, голосование против без обратной связи не поможет улучшить сообщения.





Если вы хотите обновить привязанное к данным свойство TextTextBlock, вы должны установить свойство источника, к которому он привязан, то есть свойство BalanceclassObject. Также обратите внимание, что класс ClassName должен реализовывать интерфейс INotifyPropertyChanged и вызывать уведомления об изменениях.
Установка в поле classObject нового экземпляра ClassName не должна обновлять TextBlock, если вы не вызовете Bindings.Update() после этого.
Я удалил установку нового кода экземпляра, но он по-прежнему не работает, и в классе Observable реализован INotifyProperyChanged, который, в свою очередь, создается как свойство ViewModel. Я использовал ObservableCollection аналогичным образом, но он работает.
Вы не привязываете TextBlock к Observable, так какое это имеет значение? Вы привязываетесь к className.Balance, не так ли? Зачем вы вообще создаете Onservable? В любом случае, похоже, вы его где-то не используете.
Как мне привязать TextBlock к Observable, я подумал, что сделать его как свойство класса достаточно, поскольку у меня установлен геттер для нового экземпляра ViewModel i, e Observable. Нужно ли мне объявлять объект ClassName в классе Observable?
Какое свойство Observable вы хотите привязать TextBlock к ...!? Класс Observable не имеет свойств.
все свойства объекта className. Вызов Bindings.Update() решил проблему. Большое спасибо!
Что здесь означает "не работает"? Чего вы ожидали и когда?