Минимальный пример, демонстрирующий поведение:
MainWindow.xaml:
Код: Выделить всё
Код: Выделить всё
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.