使用MVVM-Light在后向导航上刷新绑定

时间:2012-01-13 23:21:53

标签: windows-phone-7 binding navigation refresh mvvm-light

场景:我从我的应用主页开始。我导航到子页面A,更改值,点击后退按钮,主页面中的绑定TextBlock不会更改。如果我导航到子页面B,则使用相同绑定的TextBlock会更改。同样,如果我再次转到页面A,我会看到更改的值。如果我退出应用程序,新值将显示在主页面上。只是在使用后退按钮时才会触发刷新。

我的所有INotifyPropertyChanged内容都有效。就像我说的那样,除了导航回主页之外,绑定在每个场景中都有效。如何发送消息或以其他方式触发刷新该页面上的绑定?谢谢!

修改

基于willmel的接受答案,这就是我所做的:

我的MainPage.xaml文件有这个标记:

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

我的MainViewModel.cs文件包含:

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

我将它添加到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);
        }
    }

1 个答案:

答案 0 :(得分:2)

如果子页面更改了属性,则在视图模型中要修改。 (注意这里,属性是bool类型,但可以是任何东西)

  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();