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

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

Сообщение Anonymous »

У меня есть элемент управления с привязкой к свойству Visibility. Я хотел бы переопределить привязку и скрыть элемент управления всякий раз, когда пользователю не хватает определенного разрешения.
Мультипривязка могла бы быть вариантом, но это довольно многословно и потребует преобразователя, который объединяет значения видимости; эти проверки разрешений являются довольно детальными и разбросаны по всей базе кода, поэтому размер кода значительно увеличится, что несколько ухудшит читаемость.
В поисках более чистого решения я создал прикрепленное свойство, которое оценивает разрешение и переводит значение видимости в значение «Свернуто», если разрешение недоступно. Однако это не работает, как видно из следующего минимального примера.
MainWindow.xaml: MainWindow.xaml.cs:

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

public partial class MainWindow : Window
{
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 HideProperty =
DependencyProperty.RegisterAttached(
"Hide",
typeof(bool),
typeof(Permission),
new PropertyMetadata(false, OnHideChanged));

public static bool GetHide(DependencyObject d) => (bool)d.GetValue(HideProperty);
public static void SetHide(DependencyObject d, bool value) => d.SetValue(HideProperty, value);

private static void OnHideChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if ((bool)e.NewValue && d is UIElement element)
element.SetValue(UIElement.VisibilityProperty, Visibility.Collapsed);
}
}
Это не работает, если также имеется привязка к свойству Visibility:
Изображение

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

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