如何在WinRT中强制重新绑定,因为它在WPF中是可能的

本文关键字:因为 WPF WinRT 新绑定 绑定 | 更新日期: 2023-09-27 18:05:22

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

我怎样才能在用户控件中实现与模型相同的方式更新复选框,因为它在导航后为userinputpage工作?如有任何帮助,不胜感激。

// 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);
        }
    }
}

这是视图模型中的相关代码(每个vm都一样,但在这种情况下vm来自usercontrol):

class MyUserControlViewModel : ViewModel
{
    private readonly ISingletonVM _singletonVM;
    public MyUserControlViewModel(ISingletonVM singletonVM)
    {
        _singletonVM = singletonVM;
    }
    public bool TestChecked
    {
        get
        {
            return _singletonVM.TestChecked;
        }
        set
        {
            _singletonVM.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>
 ...

UserInputPage:

<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"/>
...

用户控件:

<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>

如何在WinRT中强制重新绑定,因为它在WPF中是可能的

您的用户控件永远不会收到关于MyUserControlViewModel.TestChecked属性更改的通知,这就是视图永远不会更新的原因。要解决这个问题,您可以在MyUserControlViewModel的构造函数中订阅SingletonVM.PropertyChanged事件。您的ISingletonVM需要实现INotifyPropertyChanged接口。所以MyUserControlViewModel的构造函数是这样的:

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