2016-01-25 40 views
0

我试图控制的可视性绑定到一个全局变量:UWP窗口10能见度绑定到一个全局变量

我有能见度转换器:

public class BooleanToVisibilityConverter : IValueConverter 
{ 
    public bool IsReversed { get; set; } 

    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     return (value is bool && (bool)value) ? Visibility.Visible : Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     return value is Visibility && (Visibility)value == Visibility.Visible; 
    } 


} 

我还创建了一个类,自DependencyObject继承:

public class Verified : DependencyObject 
{ 
    public static readonly DependencyProperty VerifiedUserNameProperty = DependencyProperty.Register(
     "VerifiedUserName", 
     typeof(string), 
     typeof(Verified), 
     new PropertyMetadata(string.Empty) 
     ); 

    public string VerifiedUserName 
    { 
     get { return (string)GetValue(VerifiedUserNameProperty); } 
     set { SetValue(VerifiedUserNameProperty, value); } 
    } 

    public static readonly DependencyProperty IsVerifiedProperty = DependencyProperty.Register(
     "IsVerified", 
     typeof(bool), 
     typeof(Verified), 
     new PropertyMetadata(false, new PropertyChangedCallback(IsVerifiedChanged)) 
    ); 

    public bool IsVerified 
    { 
     get { return (bool)GetValue(IsVerifiedProperty); } 
     set { SetValue(IsVerifiedProperty, value); } 
    } 

    private static void IsVerifiedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     Verified container = d as Verified; 
     bool latestIsVerifiedValue = (bool)e.NewValue; 
     if (latestIsVerifiedValue == true) 
     { 
      //To Do 
     } 
    } 
} 
在我的App.xaml

我创建变量:

public static Verified myValidator = new Verified(); 

public static BooleanToVisibilityConverter myConverter = new BooleanToVisibilityConverter(); 

在一个简单的页面中,我添加了一个文本框,并且我想将它的可见性绑定到myValidator变量。

为了实现这个目标,我在代码中创建绑定:

Binding myBinding = new Binding(); 
myBinding.Source = App.myValidator; 
myBinding.Path = new PropertyPath("IsVerified"); 
myBinding.Mode = BindingMode.OneWay; 
myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
myBinding.Converter = App.myConverter; 
BindingOperations.SetBinding(txtName2, VisibilityProperty, myBinding); 

在App.xaml中:我设置我的验证的价值是这样的:

App.myValidator.IsVerified = false; 

当我导航到简单页面的文本框不可见(OK)。

为了测试行为,我在屏幕上添加了一个按钮,并添加了代码以更改myValidator.isVerified的值。

当我更改我的App.myValidator.IsVerified的值时,文本框的可见性不会改变。我该如何解决这个问题?

+0

尝试在转换器设置断点,看看如果它实际上受到打击。我怀疑它不是。 –

+0

它第一次到达转换器。我更改IsVerified的值时验证器的propertyChange事件始终正确执行。但在第一次转换器没有再被击中之后。 – user1282441

+0

不知道这是否会这样做,但也尝试从'INotifyPropertyChanged'继承并实现它,然后看它是否有效。 –

回答

3

绑定系统使用反射来查找属性,它不寻找“字段”。

当你声明

public static Verified myValidator = new Verified(); 

你声明一个领域,而不是财产。

在App.cs更改myValidator的属性将解决这个问题,下面,

public static Verified myValidator { get; set; } = new Verified(); 

更新! 它工作的原因是因为我不小心声明中MainPage.cs经过验证的资源,

public sealed partial class MainPage : Page 
{ 
    public Verified myValidator1 {get; set;} // the property name does not matter 

    public MainPage() 
    { 
     this.InitializeComponent(); 
    } 
} 

不知道为什么它的作品,我仍然在寻找到它。

+0

我这样做,它没有工作。我想我以前尝试过,我尝试过多种组合,但没有成功。在某个时候,它正在工作,当时我正在使用资源以声明方式进行绑定。但我无法找到一种方法来处理全局变量。 – user1282441

+0

我意识到我在MainPage.cs中声明了一个Verified实例(public Verified myVerified {get; set;}),其中声明了txtName2。对我来说,添加这行代码使绑定起作用似乎很奇怪。 – Jackie

1

基本问题是您的财产不发出更改的事件,所以您的绑定甚至不知道该属性已更改,更不用说它应该调用您的转换方法。实现INotifyPropertyChanged应该在属性更改时通知它,然后它应该调用转换器并执行您想要的操作。

0

首先,我可以在我身边重现这个问题。 要验证根本原因,我注册了已验证。IsVerifiedProperty的的PropertyChanged回调:

private long token; 

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
      token = App.myValidator.RegisterPropertyChangedCallback(Verified.IsVerifiedProperty, ChangedCallback); 
      base.OnNavigatedTo(e); 
} 

private void ChangedCallback(DependencyObject sender, DependencyProperty dp) 
{ 
      if (dp == Verified.IsVerifiedProperty) 
      { 
       System.Diagnostics.Debug.WriteLine("ChangedCallback" + sender.GetValue(dp)); 
       System.Diagnostics.Debug.WriteLine("ChangedCallback" + txtName2.Visibility); 
      } 
} 

protected override void OnNavigatedFrom(NavigationEventArgs e) 
{ 
      App.myValidator.UnregisterPropertyChangedCallback(Verified.IsVerifiedProperty, token); 
      base.OnNavigatedFrom(e); 
} 

如预期的PropertyChanged无法被触发,因此该解决方案是实现INotifyPropertyChanged的用于验证类接口:

public class Verified : DependencyObject, INotifyPropertyChanged 
{ 
     public static readonly DependencyProperty IsVerifiedProperty = DependencyProperty.Register(
      "IsVerified", 
      typeof(bool), 
      typeof(Verified), 
      new PropertyMetadata(false, new PropertyChangedCallback(IsVerifiedChanged)) 
     ); 

     public bool IsVerified 
     { 
      get { return (bool)GetValue(IsVerifiedProperty); } 
      set { SetValue(IsVerifiedProperty, value); 
       if (PropertyChanged != null) 
        PropertyChanged(this, new PropertyChangedEventArgs("IsVerified")); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     private static void IsVerifiedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      Verified container = d as Verified; 
      bool latestIsVerifiedValue = (bool)e.NewValue; 
      if (latestIsVerifiedValue == true) 
      { 
       //To Do 
      } 
     } 
}