C# 如何在WinRT中强制重新绑定,因为这在WPF中是可能的?

C# 如何在WinRT中强制重新绑定,因为这在WPF中是可能的?,c#,mvvm,user-controls,windows-runtime,prism,C#,Mvvm,User Controls,Windows Runtime,Prism,我有一个基于prism的WinRT项目,有几个页面、用户控件等。 出于某种原因,我需要将多个视图绑定到viewmodels访问的单个模型对象(每个视图都属于一个视图)。 单一模型对象由Unity容器注入,就像其他对象一样,需要像eventaggregator那样是单例的。 为了简单起见,我举了一个例子,每个视图中只有一个bool变量绑定到一个复选框,应该在视图上同步。 我的问题是:当我选中主页中的复选框时,第二个页面中的复选框在导航到该页面时跟随该值(示例中为UserInpuPage),而不是主

我有一个基于prism的WinRT项目,有几个页面、用户控件等。 出于某种原因,我需要将多个视图绑定到viewmodels访问的单个模型对象(每个视图都属于一个视图)。 单一模型对象由Unity容器注入,就像其他对象一样,需要像eventaggregator那样是单例的。 为了简单起见,我举了一个例子,每个视图中只有一个bool变量绑定到一个复选框,应该在视图上同步。 我的问题是:当我选中主页中的复选框时,第二个页面中的复选框在导航到该页面时跟随该值(示例中为UserInpuPage),而不是主页上UserControl位置的复选框。 调试会话之后,我看到单个模型中的变量具有正确的值,但是Usercontrol(示例中的MyUserControl)上的GUI没有更新。 WinRT库中似乎不存在类似WPF中的GetBindingExpression(…)和UpdateTarget()这样的机制。 出于设计原因(使用prism mvvm,我不想破坏autowire和vm动态实例化的概念),在页面和/或usercontrol的参考资料部分中定义的静态上下文不是我想要的

在导航后,如何以与userinputpage相同的方式使用模型更新usercontrol中的复选框? 任何帮助都将不胜感激

// Interface mendatory to work with Unitiy-Injection for RegisterInstance<ISingletonVM>(...)
public interface ISingletonVM
{
    bool TestChecked{ get; set; }
}

public class SingletonVM : BindableBase, ISingletonVM
{

    bool _testChecked = false;
    public bool TestChecked
    {
        get
        {
            return _testChecked;
        }

        set
        {
            SetProperty(ref _testChecked, value);
        }
    }
}
三个视图的相关XAML代码片段:

主页:

<prism:VisualStateAwarePage x:Name="pageRoot"  x:Class="HelloWorldWithContainer.Views.MainPage"...>
...    
    <StackPanel Grid.Row="2" Orientation="Horizontal">
    <ctrl:MyUserControl ></ctrl:MyUserControl>
    <CheckBox IsChecked="{Binding TestChecked, Mode=TwoWay}" Content="CheckBox" HorizontalAlignment="Left" VerticalAlignment="Top"/>
    </StackPanel>
 ...

...    
...

用户输入页面:

<prism:VisualStateAwarePage x:Name="pageRoot"
                        x:Class="HelloWorldWithContainer.Views.UserInputPage" 
...
<CheckBox IsChecked="{Binding TestChecked, Mode=TwoWay}" Content="CheckBox" HorizontalAlignment="Left" Margin="440,190,0,0" VerticalAlignment="Top"/>
...

您的用户控件从未收到有关
MyUserControlViewModel.TestChecked
属性更改的通知,这就是视图从未更新的原因。要解决此问题,您可以在
MyUserControlViewModel
的构造函数中订阅
SingletonVM.PropertyChanged
事件。您的
ISingletonVM
需要实现
INotifyPropertyChanged
接口。因此,
MyUserControlViewModel
的构造函数如下所示:

public MyUserControlViewModel(ISingletonVM singletonVM)
{
     _singletonVM = singletonVM;
     _singletonVM.PropertyChanged += (sender, args) => OnPropertyChanged("TestChecked");
}

非常感谢,将viewmodel的处理程序添加到singleton模型中就成功了。
<UserControl
x:Class="HelloWorldWithContainer.Views.MyUserControl" prism:ViewModelLocator.AutoWireViewModel="True"    
<Grid>
    <CheckBox Content="CheckBox" IsChecked="{Binding TestChecked, Mode=TwoWay}" HorizontalAlignment="Left" VerticalAlignment="Top" Width="282"/>
</Grid>
public MyUserControlViewModel(ISingletonVM singletonVM)
{
     _singletonVM = singletonVM;
     _singletonVM.PropertyChanged += (sender, args) => OnPropertyChanged("TestChecked");
}