如何根据Windows Phone 7中页面ViewModel上的属性更改DataTemplate?

时间:2013-02-25 21:29:26

标签: windows-phone-7 xaml binding

我有一个ViewModel,它包含一个Boolean属性,告诉你用户是否已经过身份验证。

我有一个WrapPanel,它绑定到一组配置文件。这些配置文件的DataTemplate有一个图标 - 一个用于未经过身份验证的用户的挂锁和用于验证用户的打开挂锁。理想情况下,这些将绑定到ViewModel上的布尔值,但模板的DataContext是各个配置文件对象。

我试过了,

  • 将绑定中的Source选择器设置为specified here,尽管看起来Windows Phone 7不支持x:Reference
  • 我也尝试了Inversion of Control(?) method detailed here(但我的对象上找不到containerLocator
  • 我尝试应用Style.Trigger但Windows Phone 7不支持这些
  • 我还尝试访问后面的代码中的XAML元素并以事件触发器的方式更新,但是我无法处理DataTemplate中的Image元素

2 个答案:

答案 0 :(得分:0)

评论后编辑:WP7不支持样式触发器。但如果有人在以下版本中寻找这个答案,我会在下面回复:

我会使用Style Trigger here来动态更新图标Source属性 - 作为DataTemplate风格的一部分,这样您就可以获得抓住你的Image

答案 1 :(得分:0)

我发现基于an answer by Damian Antonowicz工作但没有实现他使用的控制方法的完全反转的一种方法如下,

创建一个部分类,它解析为视图模型命名空间下的视图模型实例,例如

public partial class ViewModelInstanceLocator
{
    public AppViewModel AppViewModel // Or whatever the type of your view-model is ...
    {
        get 
        { 
            return App.VM; // Or wherever your view model instance is ...
        }
    }
}

将XAML页面中的另一半定义为资源,以便将其称为静态资源,我在App.xaml中执行此操作,以便可以在任何地方引用它,

<ResourceDictionary>
    <viewmodel:ViewModelInstanceLocator x:Key="ViewModelInstanceLocator" />
    ...
</ResourceDictionary>

如果还没有对视图模型命名空间的引用,则可能需要包含相关的命名空间,例如在顶部,

    xmlns:viewmodel="clr-namespace:MyAppNamespace.ViewModel"

最后要按如下方式绑定到视图模型,

{Binding AppViewModel.SomeProperty, Source={StaticResource ViewModelInstanceLocator}}

绑定更新像往常一样,就像通过DataContext引用了视图模型实例一样。但是,它不适用于设计时数据