В приложении Avalonia MVVM невозможно заставить работать измененную привязку выбора ComboBox.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 В приложении Avalonia MVVM невозможно заставить работать измененную привязку выбора ComboBox.

Сообщение Anonymous »

Я реализую простой редактор набора плиток для ретро-игр, используя Avalonia, CommunityToolkit MVVM и .NET 8. Я работаю над диалогом «Новый набор плиток», и у меня есть поле со списком для выбора типа набора плиток (фиксированный размер). или переменный размер). ComboBox привязан к Enum, определенному следующим образом:

Код: Выделить всё

public enum TilesetDimensions
{
[EnumDescriptor(identifier: "FixedSize")]
FixedSize,
[EnumDescriptor(identifier: "VariableSize")]
VariableSize
}
Атрибут EnumDescriptor — это мой собственный класс, который добавляет в emum несколько дополнительных элементов метаданных. Некоторое время это работает нормально, и идентификатор используется для поиска языкового перевода (отображается в ComboBox через конвертер).
Я специально пытаюсь скрыть метку после ComboBox в зависимости от выбранного значения. Код axaml для ComboBox выглядит следующим образом. Привязки TilesetTypes, SelectedTilesetType и IsFixedSize определены в ViewModel.

Код: Выделить всё

public ObservableCollection TilesetTypes { get; } =
new ObservableCollection(Enum.GetValues());

[ObservableProperty]
[NotifyPropertyChangedFor(nameof(IsFixedSize))]
private TilesetDimensions selectedTilesetType = TilesetDimensions.FixedSize;

public bool IsFixedSize => SelectedTilesetType == TilesetDimensions.FixedSize;

Все работает нормально, за исключением скрытия метки при выборе «Переменный размер». Поле со списком заполняется правильно переведенными текстовыми значениями, и видимость метки работает нормально, если я изменю значение по умолчанию SelectedTilesetType во время разработки. Он просто отказывается изменяться во время выполнения.
Я пытался добавить событие, чтобы перехватить его, и попытался вручную назначить событие PropertyChanged в ViewModel. Точки останова не достигаются, ничего не регистрируется, когда выбранное значение изменяется во время выполнения. Я перепробовал все возможные варианты, даже попробовал перейти на ReactiveUI, но ЭТО тоже не смогло изменить видимость.

Код: Выделить всё

partial void OnSelectedTilesetTypeChanging(TilesetDimensions oldValue, TilesetDimensions newValue)
{
Debug.WriteLine($"Selected tileset type changing from {oldValue} to {newValue}");
}

Код: Выделить всё

PropertyChanged += (sender, args) =>
{
if (args.PropertyName == nameof(SelectedTilesetType))
{
Debug.WriteLine($"Selected tileset type changed to {SelectedTilesetType}");
}
};
Я пробовал StackOverflow, Google Searches, CoPilot и т. д., но не могу понять, что делаю не так. Мне кажется, что это должно быть что-то простое, но я не знаю, что именно.

Подробнее здесь: https://stackoverflow.com/questions/785 ... ng-to-work
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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