2017-03-15 93 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'? –