2011-07-19 49 views
1

我正在學習爲WP7(芒果)創建一個應用程序,並以某種方式出現此問題。 這不是我的應用程序的實際代碼,而是相同問題的簡化版本。我認爲主要是因爲缺乏對綁定工作原理的深入理解。INotifyPropertyChanged實現,綁定不起作用

XAML。

<TextBlock x:Name="PageTitle" Text="{Binding Title}" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 

背後的代碼。

private MainPageViewModel viewModel; 

    // Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 
     this.Loaded += new RoutedEventHandler(MainPage_Loaded); 
    } 

    void MainPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     viewModel = new MainPageViewModel(); 
     this.DataContext = viewModel; 
    } 

    private void ApplicationBarIconButton_Click(object sender, EventArgs e) 
    { 
     viewModel.GenerateTitle(); 
    } 

我的視圖模型。

 private static int counter = 0; 

    private string title; 
    public string Title 
    { 
     get { return title; } 
     set 
     { 
      if (title != value) 
      { 
       title = value; 
       OnPropertyChanged("Title"); 
      } 
     } 
    } 

    public MainPageViewModel() 
    { 
     title = "Init"; 
    } 

    public void GenerateTitle() 
    { 
     if (counter == 0) 
      title = "0"; // Title = "0" will work fine. 
     if (counter == 1) 
      title = "1"; 

     counter++; 
    } 

問題是,它只在我的ViewModel構造函數中更新一次綁定,所以標題是「Init」。

任何對GenerateTitle的調用都不會更新該屬性。如果我使用'Title'而不是'title'來調用setter,它會起作用。

或者我真的應該使用'標題'?我沒有做太多的C#,所以我對OOP的理解還不是很好。

在此先感謝。

回答

5

在二傳手下面一行是什麼通知觀察者,他值已更改二傳手:

OnPropertyChanged("Title"); 

當您使用專用字段值時,該方法未被調用,因此觀察者未被通知該屬性的值已更改。

因此,如果您希望通知觀察員,則需要使用Property。您也可以將OnPropertyChanged("Title");行添加到您的GenerateTitle()方法,但我會建議只使用該屬性。

+0

謝謝。但爲了理解這個問題,除了備份「Title」屬性外,私有字段「title」的用法是什麼?根據一般經驗法則,你會使用類中定義它的任何屬性嗎?我認爲公共財產應該只是用來在課堂以外進行訪問,並且在內部使用領域。再次感謝。 –

+0

標題字段爲該屬性提供後備存儲。在.NET中,屬性是形式化的一對方法,它在語法上看起來像訪問公共字段,但在封面下執行方法。方法操作的狀態必須存儲在某個地方 - 這就是標題。標題是方法的定義。在課堂內部,您可以使用能夠提供所需效果的構造。如果您想在不發出通知的情況下進行更改,請更改該字段。如果您想進行更改以引發通知,請使用該媒體資源 –

1

是的,你必須使用標題爲標題就是將字段設置,而標題中運行,其引發事件