Свойство WPF, объявленное в коде C# вместо XAMLC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Свойство WPF, объявленное в коде C# вместо XAML

Сообщение Anonymous »

По какой-то конкретной причине я объявил привязку в коде 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
// (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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Свойство WPF, объявленное в коде C# вместо XAML
    Гость » » в форуме C#
    0 Ответы
    13 Просмотры
    Последнее сообщение Гость
  • Как в MAUI загрузить цвета в ./Styles/Colors.xaml из ./Platforms/Windows/App.xaml + App.xaml.cs?
    Anonymous » » в форуме C#
    0 Ответы
    112 Просмотры
    Последнее сообщение Anonymous
  • WPF MVVM Используйте свойство зависимости в своем собственном usercontrol xaml
    Anonymous » » в форуме C#
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Получение размера кнопки, объявленное в XML перед надуванием
    Anonymous » » в форуме Android
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Новое значение PHP, объявленное в функции, не сохраняется/не сохраняется [PHP] [дубликат]
    Anonymous » » в форуме Php
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»