Привязки WBF не обновляются обновлениями DataContextC#

Место общения программистов C#
Ответить
Anonymous
 Привязки WBF не обновляются обновлениями DataContext

Сообщение Anonymous »

Мы используем 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;
}
Изменить.
Добавлен .gif для большей ясности.
Как вы можете видеть в .gif, содержимое обновляется, но команды из нижнего колонтитула не были обновлены.
Кроме того, в нижний колонтитул я добавил метку с привязкой TwoWay, как вы можете видеть, эта метка обновляется.
Изображение


Подробнее здесь: https://stackoverflow.com/questions/790 ... xt-updates
Ответить

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

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

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

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

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