2008-12-21 133 views
7

我在网上看到了很多将布尔值绑定到XAML中控件的可见性属性的示例。大多数优秀的例子都使用了一个BooleanToVisibiliy转换器。将XAML中的可见性绑定到可见性属性

我想设置控件上的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; 
    } 
} 

在窗口的构造函数中,我也有这个电话:

base.DataContext = this; 

当我更新ActionsVisible或this.actions.Visibility时,状态不会传输。任何想法可能会出错?

+0

你必须访问他们所创建的线程上的所有控件。您可以从其他线程更新控件,但必须使用WPF分派器通过UI线程编组更新。这[文章](http://msdn.microsoft.com/en-us/magazine/cc163328.aspx)应该有所帮助。 – 2008-12-22 09:28:37

回答

7

我认为问题是WPF无法知道你的ActionsVisible属性已经改变,因为你没有通知事实。

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

希望这有助于...

+0

我不反对这样做,但我也有一个TextBox绑定到代码隐藏的字符串属性,并且没有INotifyPropertyChanged事件。我认为通过将UpdateSourceTrigger设置为PropertyChanged,我不需要使用INotifyPropertyChanged。 – Jared 2008-12-21 18:43:49

+0

不知道它是如何做到这一点!你想发布更多的代码吗? UpdateSourceTrigger属性可以控制源(即绑定到的属性)何时被更新。它不会对您的知名度属性产生任何影响。 – 2008-12-21 18:52:27

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)); 
1

写:NotifyPropertyChanged("ActionsVisible")