2017-03-15 96 views
1

根据this instruction,我试图使用INotifyPropertyChanged函数来刷新我的UWP应用程序中的绑定数据。不幸的是,当数据的值从代码后面改变时,事件PropertyChangedEventHandler返回null值(PropertyChanged = null在检查这个陈述期间:if(PropertyChanged!= null))。当值从应用程序页面更改(通过输入值到文本框)PropertyChanged设置了一些值。UWP INotifyPropertyChanged为空(c#)

我的类INotifyPropertyChanged的:

public sealed partial class PartCreatePage : Page 
{ 

    private UserOperation operation { get; set; } 

    public PartCreatePage() 
    { 
     this.InitializeComponent(); 
     operation = new UserOperation(); 

    } 
    private void OperationAck_Button(object sender, RoutedEventArgs e) 
    { 
     operation.BeginDistance = 500; 
    } 

和XAML:

public class UserOperation : INotifyPropertyChanged 
{ 
    private int _beginDistance, _endDistance; 

    public int BeginDistance {get { return _beginDistance; } 
     set 
     { 
      _beginDistance = value; 
      NotifyPropertyChanged("BeginDistance"); 
     } 
    } 
    public int EndDistance { get { return _endDistance; } 
     set 
     { 
      _endDistance = value; 
      NotifyPropertyChanged("EndDistance"); 
     } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 
    public void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

} 

在后面的代码执行

     <TextBox x:Name="begin_Distance" 
          Text="{x:Bind operation.BeginDistance, Mode=TwoWay}" 
          KeyDown="onlyNumeric_KeyDown" 
          Style="{StaticResource OperationFlyout_TextBox}" /> 
+0

你是什么意思“事件PropertyChangedEventHandler返回空值”? –

+0

这意味着:PropertyChanged = null在检查这个陈述期间:if(PropertyChanged!= null) – kristof43

+0

检查是否有帮助。我有一个类似的问题:http://stackoverflow.com/questions/42354995/propertychanged-is-null-uwp – KonKarapas

回答

0

正确的模式是...

public event PropertyChangedEventHandler PropertyChanged; 
public void NotifyPropertyChanged(string propertyName) 
{ 
    PropertyChanged handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

参考:MSDN How to Implement Property Change Notification

答:

虽则回答你的问题,你的财产变化的处理程序是空的原因是因为你不分配给您的视图模型的数据上下文。当你这样做你的绑定是有线

您的代码应设置数据上下文在构造

public sealed partial class PartCreatePage : Page 
{ 

    private UserOperation operation { get; set; } 

    public PartCreatePage() 
    { 
     this.InitializeComponent(); 
     DataContext = new UserOperation(); 
    } 

。您可以通过调用数据上下文并将其转换到您的视图模型来访问它,您可以通过CAN进行访问。这就是说,请不要这样做。 MVVM设计的重点在于,您不会在代码背后设置值。

+2

这是一种更好的做法,可以防止竞争状况,但与OP的当前问题无关。 –

+0

@DerrickMoeller我正在回答这个问题。给我一秒 –

+0

不,他正在使用'x:Bind',所以'DataContect'不是问题。 –

2

我试过你的代码,完美地工作。

如果您没有任何绑定到特定属性,那么PropertyChanged为空是完全正确的,因为没有人向它注册事件处理程序,也没有人需要获取有关更改的通知。

0

不确定UWP,但WPF可能是因为你没有指定DataContext的,所以它值得一试,下一步要做:

public PartCreatePage() 
    { 
     this.InitializeComponent(); 
     operation = new UserOperation(); 
     this.DataContext = operation; // or UWP analog 
    } 

而且,根据this link你可能要分配空的代表到你的PropertyChangedEventHandler:

public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
+0

不,他正在使用'x:Bind',因此在这种情况下甚至没有使用'DataContext'。另外为什么我们想要将一个空的委托分配给'PropertyChanged'? –