Я видел в Интернете довольно много примеров привязки логического значения к свойству 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 не может знать, что ваше свойство ActionsVisible изменилось, поскольку вы не уведомили об этом.
Ваш класс должен будет реализовать INotifyPropertyChanged, тогда в вашем методе set для ActionsVisible вам нужно будет запустить событие PropertyChanged с ActionsVisible в качестве имени свойства, которое изменилось.
Надеюсь это поможет...
Я не против этого, но у меня также есть TextBox, привязанный к строковому свойству в коде программной части, который работает без события INotifyPropertyChanged. Я думал, что, установив для UpdateSourceTrigger значение PropertyChanged, мне не нужно будет использовать INotifyPropertyChanged.
Тогда не знаю, как это происходит! Вы хотите разместить больше своего кода? Свойство UpdateSourceTrigger просто контролирует, когда обновляется источник (то есть свойство, к которому вы привязываетесь). Это не повлияет на ваше свойство видимости.
Спасибо, Крейг. Я должен был быть более ясным в своем предыдущем комментарии. Я хотел сказать, что у меня есть свойство TextBox Text, привязанное к строковому свойству в коде программной части. Это действительно работает, и если вы все еще хотите увидеть источник этого, дайте мне знать.
Я также хотел поблагодарить вас за то, что вы сказали мне использовать ActionsVisible в качестве имени свойства, потому что я продолжал получать XamlParseExceptions, когда использовал Visiblity в качестве имени свойства, и не мог понять это, пока не перечитал ваш ответ.
Измените свое свойство на 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));
При запуске этого кода в потоке, отличном от потока, которому он принадлежит, возникает исключение. Все, что я переместил в привязку, заключалось в том, чтобы позволить элементам пользовательского интерфейса обновляться из нескольких потоков. Не похоже, что это решение будет работать для меня, если оно будет работать в одном потоке.
Написать: NotifyPropertyChanged("ActionsVisible")
Вы должны получить доступ ко всем элементам управления в потоке, в котором они были созданы. Вы можете обновлять элементы управления из других потоков, но вы должны маршалировать обновление через поток пользовательского интерфейса с помощью диспетчера WPF. Этот статья должен помочь.