Переопределить значение из привязки данных через прикрепленное свойствоC#

Место общения программистов C#
Anonymous
Переопределить значение из привязки данных через прикрепленное свойство

Сообщение Anonymous »

У меня есть элемент управления с привязкой к свойству Visibility. Я хотел бы переопределить привязку через прикрепленное свойство всякий раз, когда выполняется определенное условие. Однако привязка по-прежнему выполняется после SetValue в прикрепленном свойстве: отладчик показывает доступ к методу получения ButtonVisibility.

Минимальный пример, демонстрирующий поведение:
MainWindow.xaml: MainWindow.xaml.cs:

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

public partial class MainWindow
{
public MainWindow() { DataContext = new ViewModel(); InitializeComponent(); }
}

public class ViewModel : INotifyPropertyChanged
{
public Visibility ButtonVisibility => Visibility.Visible;
public event PropertyChangedEventHandler? PropertyChanged;
}

public static class Permission
{
public static readonly DependencyProperty HideIfNotProperty =
DependencyProperty.RegisterAttached(
"HideIfNot",
typeof(string),
typeof(Permission),
new PropertyMetadata("", OnHideIfNotChanged));

public static string GetHideIfNot(DependencyObject d) => (string)d.GetValue(HideIfNotProperty);
public static void SetHideIfNot(DependencyObject d, string value) => d.SetValue(HideIfNotProperty, value);

private static void OnHideIfNotChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is UIElement element && e.NewValue is "some-complex-permission-expression")
{
BindingOperations.ClearBinding(d, UIElement.VisibilityProperty);
element.SetValue(UIElement.VisibilityProperty, Visibility.Collapsed);
}
}
}
Результат:
Изображение

Обе кнопки должны быть скрыты.
Как можно надежно переопределить привязку через прикрепленное свойство?

Примечание. Я уже решил свою проблему с помощью MarkupExtension, но мне все еще интересно, почему привязку нельзя перезаписать. Кажется, я что-то неправильно понял во внутренней работе WPF.

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