2012-01-13 80 views
2

場景:我從我的應用程序主頁面開始。我導航到子頁面A,更改值,點擊後退按鈕,主頁面中的綁定TextBlock不會更改。如果我導航到子頁面B,則使用相同綁定的TextBlock會發生變化。同樣,如果我再次訪問頁面A,我會看到更改後的值。如果我退出應用程序,新的值顯示在主頁面上。只是在使用後退按鈕時,刷新不會被觸發。使用MVVM-Light刷新導航返回導航

我已經得到了我所有的INotifyPropertyChanged工作。就像我所說的那樣,除了導航返回到主頁面外,綁定還可以在每種場景中使用。如何發送消息或以其他方式觸發該頁面上綁定的刷新?謝謝!

編輯:

基於從willmel接受的答案,這裏是我所做的:

我MainPage.xaml中的文件有這個標記:

<TextBlock Text="{Binding Title, Mode=OneWay}" /> 

我MainViewModel.cs文件有:

 public string Title 
    { 
     get { return ProfileModel.Instance.DescriptionProfile.Title; } 
    } 

An d我已將此添加到MainViewModel構造:

Messenger.Default.Register<PropertyChangedMessage<string>>(this, 
     (action) => DispatcherHelper.CheckBeginInvokeOnUI(
     () => RaisePropertyChanged("Title"))); 

另一種觀點認爲,我有以下的標記:

<TextBox Grid.Row="1" Width="250" Height="100" Text="{Binding TitleEdit, Mode=TwoWay}" /> 

在其視圖模型獲取/設置字符串時,我使用這個:

 public string TitleEdit 
    { 
     get { return ProfileModel.Instance.DescriptionProfile.Title; } 

     set 
     { 
      if (ProfileModel.Instance.DescriptionProfile.Title == value) return; 

      string oldValue = ProfileModel.Instance.DescriptionProfile.Title; 


      ProfileModel.Instance.DescriptionProfile.Title = value; 

      RaisePropertyChanged("Title", oldValue, value, true); 
     } 
    } 

回答

2

在您的視圖模型中,如果子頁面更改屬性,則希望對其進行修改。 (這裏需要注意,該屬性的類型是布爾的,但可以是任何東西)

Messenger.Default.Register<PropertyChangedMessage<bool>>(this, 
    (action) => DispatcherHelper.CheckBeginInvokeOnUI(
    () => 
     { 
     MessageBox.Show(action.newValue.ToString()); 
     //do what you want here (i.e. RaisePropertyChanged on a value they share) 
    })); 

當你在子類中使用RaisePropertyChanged,使用廣播超載。

RaisePropertyChanged("Preference", oldValue, value, true); 

最後,請注意使用DispatcherHelper,你需要添加以下到您App構造(App.xaml.cs

DispatcherHelper.Initialize(); 
+0

謝謝!基於此做出更改後,我能夠做到我需要的東西。我正在修改我的OP,以顯示基於此的一些細節。 – Stonetip 2012-01-14 02:13:00