将 XAML 中的可见性绑定到可见性属性

Posted

技术标签:

【中文标题】将 XAML 中的可见性绑定到可见性属性【英文标题】:Binding Visibility in XAML to a Visibility property 【发布时间】:2010-09-27 22:32:45 【问题描述】:

我在 Internet 上看到了很多将布尔值绑定到 XAML 中控件的 Visibility 属性的示例。大多数好的示例都使用 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 调度程序通过 UI 线程编组更新。这个article 应该会有所帮助。 【参考方案1】:

将您的属性更改为 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));

【讨论】:

在拥有它的线程以外的线程中运行此代码时,会出现异常。我转向绑定的全部内容是允许 UI 元素从多个线程更新。如果它必须在单个线程上运行,那么这个解决方案似乎对我不起作用。【参考方案2】:

我认为问题在于 WPF 无法知道您的 ActionsVisible 属性已更改,因为您没有通知这一事实。

您的类需要实现 INotifyPropertyChanged,然后在 ActionsVisible 的 set 方法中,您需要触发 PropertyChanged 事件,并将 ActionsVisible 作为已更改的属性名称。

希望这会有所帮助...

【讨论】:

我不反对这样做,但我也有一个 TextBox 绑定到代码隐藏中的字符串属性,并且在没有 INotifyPropertyChanged 事件的情况下工作。我认为通过将 UpdateSourceTrigger 设置为 PropertyChanged,我不需要使用 INotifyPropertyChanged。 不知道它是怎么做到的!您想发布更多代码吗? UpdateSourceTrigger 属性仅控制源(即您绑定到的属性)何时更新。它不会对您的可见性属性产生任何影响。 谢谢克雷格。我应该更清楚我之前的评论。我的意思是说我有一个 TextBox 的 Text 属性绑定到代码隐藏中的字符串属性。这确实有效,如果您仍想查看源代码,请告诉我。 我还要感谢您告诉我使用 ActionsVisible 作为属性名称,因为当我使用 Visiblity 作为属性名称时,我不断收到 XamlParseExceptions 并且直到我重新阅读才弄明白你的答案。【参考方案3】:

写信:NotifyPropertyChanged("ActionsVisible")

【讨论】:

以上是关于将 XAML 中的可见性绑定到可见性属性的主要内容,如果未能解决你的问题,请参考以下文章

如何将 StackPane 的可见性绑定到属性?

仅通过 XAML 将复选框绑定到元素可见性

WPF - 可以将标签的属性(可见性)绑定到标签的目标吗?

在 UWP 中未检测到绑定可见性属性的变量

如何绑定可见性属性

DataGridTextColumn 可见性绑定