Привязка видимости в XAML к свойству видимости

Я видел в Интернете довольно много примеров привязки логического значения к свойству Visibility элемента управления в XAML. В большинстве хороших примеров используется преобразователь BooleanToVisibiliy.

Я хотел бы просто установить свойство Visible в элементе управления для привязки к свойству System.Windows.Visibility в коде программной части, но, похоже, оно не работает.

Это мой XAML:

<Grid x:Name = "actions" Visibility = "{Binding Path=ActionsVisible, UpdateSourceTrigger=PropertyChanged}" />

Это код собственности:

private Visibility _actionsVisible;
public Visibility ActionsVisible
{
   get
   {
      return _actionsVisible;
   }
   set
   {
      _actionsVisible = value;
   }
}

В конструкторе Window у меня тоже есть такой вызов:

base.DataContext = this;

Когда я обновляю ActionsVisible или this.actions.Visibility, состояние не передается. Есть идеи, что может пойти не так?

Вы должны получить доступ ко всем элементам управления в потоке, в котором они были созданы. Вы можете обновлять элементы управления из других потоков, но вы должны маршалировать обновление через поток пользовательского интерфейса с помощью диспетчера WPF. Этот статья должен помочь.

Craig Shearer 22.12.2008 12:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
1
23 137
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я думаю, проблема в том, что WPF не может знать, что ваше свойство ActionsVisible изменилось, поскольку вы не уведомили об этом.

Ваш класс должен будет реализовать INotifyPropertyChanged, тогда в вашем методе set для ActionsVisible вам нужно будет запустить событие PropertyChanged с ActionsVisible в качестве имени свойства, которое изменилось.

Надеюсь это поможет...

Я не против этого, но у меня также есть TextBox, привязанный к строковому свойству в коде программной части, который работает без события INotifyPropertyChanged. Я думал, что, установив для UpdateSourceTrigger значение PropertyChanged, мне не нужно будет использовать INotifyPropertyChanged.

Jared 21.12.2008 21:43

Тогда не знаю, как это происходит! Вы хотите разместить больше своего кода? Свойство UpdateSourceTrigger просто контролирует, когда обновляется источник (то есть свойство, к которому вы привязываетесь). Это не повлияет на ваше свойство видимости.

Craig Shearer 21.12.2008 21:52

Спасибо, Крейг. Я должен был быть более ясным в своем предыдущем комментарии. Я хотел сказать, что у меня есть свойство TextBox Text, привязанное к строковому свойству в коде программной части. Это действительно работает, и если вы все еще хотите увидеть источник этого, дайте мне знать.

Jared 22.12.2008 07:42

Я также хотел поблагодарить вас за то, что вы сказали мне использовать ActionsVisible в качестве имени свойства, потому что я продолжал получать XamlParseExceptions, когда использовал Visiblity в качестве имени свойства, и не мог понять это, пока не перечитал ваш ответ.

Jared 22.12.2008 07:43

Измените свое свойство на DependencyProperty. Это сделает обновление за вас.

        public Visibility ActionsVisible
    {
        get { return (Visibility)GetValue(ActionsVisibleProperty); }
        set { SetValue(ActionsVisibleProperty, value); }
    }

    // Using a DependencyProperty as the backing store for ActionsVisible.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ActionsVisibleProperty =
        DependencyProperty.Register("ActionsVisible", typeof(Visibility), typeof(FooForm));

При запуске этого кода в потоке, отличном от потока, которому он принадлежит, возникает исключение. Все, что я переместил в привязку, заключалось в том, чтобы позволить элементам пользовательского интерфейса обновляться из нескольких потоков. Не похоже, что это решение будет работать для меня, если оно будет работать в одном потоке.

Jared 22.12.2008 05:45

Написать: NotifyPropertyChanged("ActionsVisible")

Другие вопросы по теме