Вы можете увидеть это в этом примере кода, где я установил одно начальное значение «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
// (here SelectedItem.FirstProperty == "333")
}
#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
}
Я знаю, что TextBox никогда не должен входить в ViewModel, как и что-либо, связанное с представлением, пожалуйста, не останавливайтесь на этих деталях. Этот код предназначен только для целей обучения и понимания того, как работают привязки, но на данный момент я не до конца его понимаю. Я был бы признателен за объяснения, как изменить код, чтобы он отображал «333».
Подробнее здесь: https://stackoverflow.com/questions/781 ... ad-of-xaml