Механизм связывания
подписывается на событие PropertyChanged
объекта DataSource
, поэтому нет необходимости «инициализировать» событие вместе с реализацией INPC
, но, как вы могли заметить, событие PropertyChanged
дляСвойство QuickMath
действительно никогда не срабатывает при изменении BoundNumber
или BoundNumber2
.
Вы можете исправить это различными способами, например, явно вызвать OnPropertyChanged для всех затронутых свойств:
private int _boundNumber;
public int BoundNumber
{
get { return _boundNumber; }
set
{
if (_boundNumber != value)
{
_boundNumber = value;
OnPropertyChanged();
OnPropertyChanged(nameof(QuickMath));
}
}
}
Обратите внимание, что таким образом вы можете оставить свойство QuickMath
доступным только для чтения.Этот подход хорошо работает в других ситуациях, например, со свойствами, связанными со временем, например, если ваше свойство источника данных форматирует строку, такую как «Отредактировано 2 минуты назад» на основе записанной отметки времени и текущего времени, и вы вызываете PropertyChanged
как временное задание.
public int QuickMath => _boundNumber + _boundNumber2;
В качестве альтернативы вы можете обновить QuickMath
вместе с изменением BoundNumber
и BoundNumber2
, чтобы инициировать OnPropertyChanged()
вызов внутри QuickMath
сеттер:
private int _boundNumber2;
public int BoundNumber2
{
get { return _boundNumber2; }
set
{
if (_boundNumber2 != value)
{
_boundNumber2 = value;
OnPropertyChanged();
QuickMath = BoundNumber + BoundNumber2;
}
}
}
Это имеет смысл, если логика в QuickMath
не позволяет сделать его доступным только для чтения.В этом случае вы должны соответствующим образом настроить геттер и использовать частный или защищенный сеттер, чтобы избежать несогласованности данных и неожиданного поведения.
private int _quickMath;
public int QuickMath
{
get { return _quickMath; }
private set
{
if (value != _quickMath)
{
_quickMath = value;
OnPropertyChanged();
}
}
}
В обоих случаях нет необходимости в двусторонней привязке к QuickMath
:
<TextBlock Grid.Row="4" Text="{Binding QuickMath, Mode=OneWay}"/>
Что касается сопутствующей заметки и обзора остальной части кода, стоит упомянуть, что механизм связывания должен отделять пользовательский интерфейс от данных, где XAML знает о свойствах объекта источника данных (именах).и типы), но не о его внутренней реализации, в то время как объект источника данных может вообще ничего не знать о XAML.Так что
- не должно быть никаких вызовов от объекта данных к
FrameworkElement
s, как MathBox.Text
- считается хорошим дизайном, когда класс объекта данных полностью отделен от страницы или элемента управлениякласс.
Надеюсь, это поможет.