如何在WPF中强制重新绑定WinRT?

时间:2015-07-29 08:27:44

标签: c# mvvm user-controls windows-runtime prism

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

如何在导航时使用与用户输入页面相同的方式更新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);
        }
    }
}

这是viewmodels中的相关代码(对于每个vm都相同,但在这种情况下来自usercontrol的vm):

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代码片段:

的MainPage:

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

1 个答案:

答案 0 :(得分:1)

您的用户控件永远不会收到有关MyUserControlViewModel.TestChecked属性更改以及视图永远不会更新的原因的通知。您可以做的一件事就是在SingletonVM.PropertyChanged的构造函数中订阅您的MyUserControlViewModel事件。您的ISingletonVM需要实施INotifyPropertyChanged界面。所以MyUserControlViewModel的构造函数将是这样的:

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