场景:我从我的应用主页开始。我导航到子页面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);
}
}
答案 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();