2012-04-09 30 views
0

我有一个包含视觉状态的列表框项目模板。我有DisplayStateBehaviors,将状态设置为开/关状态。我的实现只有1/2的作品。在初始显示时,无论DataContext中的值如何,基本状态都是活动的。当DataContext中的数据改变时,适当的状态被激活。DisplayStateBehavior最初没有在列表框项目模板中应用状态转换

如何获得列表框初始显示时显示的正确状态。

出于安全原因,我无法复制/粘贴XAML或View-Model代码。

编辑:虽然我不能复制/粘贴真正的代码,但下面的框架有望重现问题。

在全局可见的资源文件:

<DataTemplate x:Key="MyObjectItemTemplate"> 
    <Grid> 
    <VisualStateManager.VisualStateGroups> 
     ... blend goodness ... 
    </VisualStateManager.VisualStateGroups> 
    </Grid> 
</DataTemplate> 

数据上下文通过将其与列表框的主UI的ItemsTemplate属性关联传入数据模板。

<ListBox ... ItemTemplate="{DynamicResource MyObjectItemTemplate}" .../> 
+1

不知道很多关于DisplayStateBehaviors,但我在速战速决第一次尝试将InvokePropertyChanged在DataContext的是在一个时间,你知道的一切都将被设置绑定到的属性。如果DisplayStateBehavior完全依赖于datacontext的属性,并且在完全构建datacontext对象之前绑定它,那么在datacontext再次发生更改之前,它将不会有其他机会刷新自身。 – Alain 2012-04-09 17:02:59

+0

这是我对此的黑客攻击计划,但似乎并不需要它。这感觉就像是我把事情搞错了或者使用了错误的方法,因为在我看来,这是一个常见的用例。如果我的方法有缺陷,我宁愿“做对,一次”。 – PatrickV 2012-04-09 17:11:24

+0

没有代码,这很难回答。我有类似“什么是DisplayStateBehavior”,“什么是DataContext的形状”和“如何提供DataContext”等问题。有很多机会做不正确的事情,但很难看到没有代码的任何可能的失误。 – 2012-04-09 18:47:44

回答

0

我发现我的问题。如果它帮助其他人,我所做的解决它的方法是将DataTemplate的内容提取到UserControl中。这使得一切都按我的预期工作。 DataTemplate仍然存在并仍然涉及,但它只有一个元素 - 用户控件。视觉状态都是用户控件的一部分。

在全局可见的资源文件:

<DataTemplate x:Key="MyObjectItemTemplate"> 
    <MyNamespace:MyUserControl/> 
</DataTemplate> 

在单独的文件MyUserControl.cs

<UserControl ... x.Class="MyNamespace.MyUserControl" ...> 
    <Grid> 
    <VisualStateManager.VisualStateGroups> 
     ... blend goodness ... 
    </VisualStateManager.VisualStateGroups> 
    </Grid> 
</UserControl> 

数据上下文通过将其与的的ItemsTemplate属性关联传入数据模板主UI中的列表框。

<ListBox ... ItemTemplate="{DynamicResource MyObjectItemTemplate}" .../> 
+0

你可能会把你的问题算作回答。 – 2012-04-09 19:33:24

+0

我有两天的等待时间才能做到这一点。 – PatrickV 2012-04-10 11:39:50