По какой-то конкретной причине я объявил привязку в коде C# вместо того, чтобы объявлять ее в XAML, как обычно. Проблема, с которой я столкнулся, заключается в том, что когда я меняю только одно свойство объекта, INotifyPropertyChanged работает правильно и распространяет изменения, как ожидалось, но когда я меняю весь объект (ссылку), он не работает должным образом.
Вы можете увидеть это в этом примере кода, где я установил одно начальное значение «111», которое работает хорошо, затем я меняю только одно значение свойства на «222» и тоже работает как положено, но когда я устанавливаю новый объект, он не работает.
Что мне следует изменить в коде, чтобы назначение thrid также работало, а для свойства Text через привязку было установлено значение «333»?
public class MainWindowViewModel : INotifyPropertyChanged
{
private MySubClass _selectedItem;
public MySubClass SelectedItem
{
get => _selectedItem;
set
{
_selectedItem = value;
OnPropertyChanged(nameof(SelectedItem));
}
}
private MySubClass _selectedItemBefore;
public MySubClass SelectedItemBefore
{
get => _selectedItemBefore;
set
{
_selectedItemBefore = value;
OnPropertyChanged(nameof(SelectedItemBefore));
}
}
private MySubClass _selectedItemAfter;
public MySubClass SelectedItemAfter
{
get => _selectedItemAfter;
set
{
_selectedItemAfter = value;
OnPropertyChanged(nameof(SelectedItemAfter));
}
}
TextBox textBox = new TextBox();
public MainWindowViewModel()
{
SelectedItemBefore = new MySubClass
{
FirstProperty = "111"
};
SelectedItemAfter = new MySubClass
{
FirstProperty = "333"
};
SelectedItem = SelectedItemBefore;
var firstPropertyBinding = new Binding("FirstProperty") { Source = SelectedItem, Mode = BindingMode.TwoWay };
BindingOperations.SetBinding(textBox, TextBox.TextProperty, firstPropertyBinding);
Console.WriteLine($"Text here is: {textBox.Text}");
// It's "111", so OK!!!
SelectedItem.FirstProperty = "222";
Console.WriteLine($"Text here is: {textBox.Text}");
// It's "222", so OK!!!
SelectedItem = SelectedItemAfter;
Console.WriteLine($"Text here is: {textBox.Text}");
// ¡¡¡FAIL!!!: expected "333" but it is "222" yet
}
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
var changed = PropertyChanged;
if (changed == null)
return;
changed.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
public class MySubClass : INotifyPropertyChanged
{
private string _firstProperty;
public string FirstProperty
{
get => _firstProperty;
set
{
_firstProperty = value;
OnPropertyChanged(nameof(FirstProperty));
}
}
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
var changed = PropertyChanged;
if (changed == null)
return;
changed.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
Подробнее здесь: https://stackoverflow.com/questions/781 ... ad-of-xaml
Свойство WPF, объявленное в коде C# вместо XAML ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
WPF MVVM Используйте свойство зависимости в своем собственном usercontrol xaml
Anonymous » » в форуме C# - 0 Ответы
- 4 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Новое значение PHP, объявленное в функции, не сохраняется/не сохраняется [PHP] [дубликат]
Anonymous » » в форуме Php - 0 Ответы
- 30 Просмотры
-
Последнее сообщение Anonymous
-