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

7

我在互联网上看到了许多关于在XAML中将布尔值绑定到控件的可见性属性的示例。大部分好的示例都使用了BooleanToVisibility转换器。

我想直接将控件的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 Dispatcher在UI线程上进行更新。这篇文章应该会有所帮助。 - Craig Shearer
3个回答

8

将您的属性更改为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 元素从多个线程更新。如果必须在单个线程上运行,则似乎这个解决方案对我没有作用。 - Jared

7

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

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

希望这可以帮助您……


我不反对这样做,但是我还有一个在代码后台绑定到字符串属性的TextBox,它可以在没有INotifyPropertyChanged事件的情况下工作。我认为通过将UpdateSourceTrigger设置为PropertyChanged,我就不需要使用INotifyPropertyChanged了。 - Jared
不确定它是如何实现的!你想发布更多的代码吗?UpdateSourceTrigger属性仅控制源(即您要绑定到的属性)何时更新。它不会对您的可见性属性产生任何影响。 - Craig Shearer
谢谢Craig。我之前的评论应该表述得更清楚一些。我指的是我已经将一个TextBox的Text属性绑定到了代码后台的一个字符串属性上。这个方法有效,如果您仍然想看一下源代码,请告诉我。 - Jared
我还想感谢你告诉我使用ActionsVisible作为属性名称,因为当我使用Visibility作为属性名称时,我一直遇到XamlParseExceptions,并且在重新阅读了你的答案之前无法解决它。 - Jared

1
写: NotifyPropertyChanged("ActionsVisible")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接