Мы используем MVVM для нашего приложения WPF. Я создал расширение для ContentControl для нижнего колонтитула диалогового окна, этот нижний колонтитул содержит кнопки. Мы устанавливаем команды кнопок из ViewModel в файле xmal.
Проблема заключается в том, что команды кнопок не обновляются при обновлении DataContext – единственный способ Я нашел, что это работает, если изменить привязку на TwoWay, но тогда это означает, что мне придется сделать все команды не только для чтения.
Это явно какая-то проблема с привязкой, но я не могу найти другого решения для перехода на привязки TwoWay, возможно, кто-то другой сможет определить, что я здесь делаю неправильно:
ViewModel:
public class EditorViewModel : ObservableObject, INotifyDataErrorInfo
{
public EditorViewModel()
{
CancelCommand = new AsyncRelayCommand(OnCancelAsync);
CloseCommand = new AsyncRelayCommand(OnCloseAsync);
ConfirmCommand = new AsyncRelayCommand(OnCreateAsync);
DeleteCommand = new AsyncRelayCommand(OnDeleteAsync);
}
public IAsyncRelayCommand CancelCommand { get; }
public IAsyncRelayCommand CloseCommand { get; }
public IAsyncRelayCommand ConfirmCommand { get; }
public IAsyncRelayCommand DeleteCommand { get; }
}
UserControl:
(Если я сделаю здесь привязки TwoWay, то всё будет работать как надо — но на самом деле команды должны быть только для чтения)
DialogFooter.cs:
public static class DialogFooter
{
public static readonly DependencyProperty ConfirmButtonCommandProperty =
DependencyProperty.RegisterAttached("ConfirmButtonCommand", typeof(ICommand), typeof(DialogFooter),
new FrameworkPropertyMetadata(OnConfirmButtonCommandPropertyChanged));
private static void OnConfirmButtonCommandPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is not FrameworkElement element)
return;
element.CalculateConfirmButtonVisibility();
}
public static ICommand GetConfirmButtonCommand(FrameworkElement element)
{
return element is null
? throw new ArgumentNullException(nameof(element))
: (ICommand)element.GetValue(ConfirmButtonCommandProperty);
}
public static void SetConfirmButtonCommand(FrameworkElement element, ICommand value)
{
if (element is null)
return;
element.SetValue(ConfirmButtonCommandProperty, value);
}
}
ContentControlStyle.xaml:
Изменить...
Код из ListViewModel, вот как инициализируется EditViewModel:
private Task OnEditAsync(SelectedViewModel? selectedItem)
{
if (selectedItem != null && AllowEdits)
{
var editor = new EditorViewModel(_service, _confirmationService, _logger)
{
OnDeletion = id => _service.DeleteAsync(id),
IsEditing = true
};
editor.Initialise(new Word(selectedItem.WrittenForm, selectedItem.Language, selectedItem.SpokenForms) { Id = selectedItem.Id });
editor.RequestClose += () => SelectionChanged?.Invoke(this, null!);
SelectionChanged?.Invoke(this, editor);
}
else
{
SelectionChanged?.Invoke(this, null!);
}
return Task.CompletedTask;
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... xt-updates
Привязки не обновляются обновлениями DataContext ⇐ C#
Место общения программистов C#
-
Anonymous
1729179040
Anonymous
Мы используем MVVM для нашего приложения WPF. Я создал расширение для ContentControl для нижнего колонтитула диалогового окна, этот нижний колонтитул содержит кнопки. Мы устанавливаем команды кнопок из ViewModel в файле xmal.
[b]Проблема[/b] заключается в том, что команды кнопок не обновляются при обновлении DataContext – единственный способ Я нашел, что это работает, если изменить привязку на TwoWay, но тогда это означает, что мне придется сделать все команды не только для чтения.
Это явно какая-то проблема с привязкой, но я не могу найти другого решения для перехода на привязки TwoWay, возможно, кто-то другой сможет определить, что я здесь делаю неправильно:
[b]ViewModel:[/b]
public class EditorViewModel : ObservableObject, INotifyDataErrorInfo
{
public EditorViewModel()
{
CancelCommand = new AsyncRelayCommand(OnCancelAsync);
CloseCommand = new AsyncRelayCommand(OnCloseAsync);
ConfirmCommand = new AsyncRelayCommand(OnCreateAsync);
DeleteCommand = new AsyncRelayCommand(OnDeleteAsync);
}
public IAsyncRelayCommand CancelCommand { get; }
public IAsyncRelayCommand CloseCommand { get; }
public IAsyncRelayCommand ConfirmCommand { get; }
public IAsyncRelayCommand DeleteCommand { get; }
}
[b]UserControl:[/b]
(Если я сделаю здесь привязки TwoWay, то всё будет работать как надо — но на самом деле команды должны быть только для чтения)
[b]DialogFooter.cs:[/b]
public static class DialogFooter
{
public static readonly DependencyProperty ConfirmButtonCommandProperty =
DependencyProperty.RegisterAttached("ConfirmButtonCommand", typeof(ICommand), typeof(DialogFooter),
new FrameworkPropertyMetadata(OnConfirmButtonCommandPropertyChanged));
private static void OnConfirmButtonCommandPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is not FrameworkElement element)
return;
element.CalculateConfirmButtonVisibility();
}
public static ICommand GetConfirmButtonCommand(FrameworkElement element)
{
return element is null
? throw new ArgumentNullException(nameof(element))
: (ICommand)element.GetValue(ConfirmButtonCommandProperty);
}
public static void SetConfirmButtonCommand(FrameworkElement element, ICommand value)
{
if (element is null)
return;
element.SetValue(ConfirmButtonCommandProperty, value);
}
}
[b]ContentControlStyle.xaml:[/b]
Изменить...
Код из [b]ListViewModel[/b], вот как инициализируется EditViewModel:
private Task OnEditAsync(SelectedViewModel? selectedItem)
{
if (selectedItem != null && AllowEdits)
{
var editor = new EditorViewModel(_service, _confirmationService, _logger)
{
OnDeletion = id => _service.DeleteAsync(id),
IsEditing = true
};
editor.Initialise(new Word(selectedItem.WrittenForm, selectedItem.Language, selectedItem.SpokenForms) { Id = selectedItem.Id });
editor.RequestClose += () => SelectionChanged?.Invoke(this, null!);
SelectionChanged?.Invoke(this, editor);
}
else
{
SelectionChanged?.Invoke(this, null!);
}
return Task.CompletedTask;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79097969/bindings-not-updated-by-datacontext-updates[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия