【发布时间】:2018-06-02 16:44:36
【问题描述】:
我想知道如何使用 XAML 来使用正确的 VisualState 初始化我的 UI 元素。 没有背后的代码。因为我知道如何使用 C# 代码。
我的 UI 元素的 XAML 是这样的:
<Border x:Name="PART_Border" >
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CriticalnessStates">
<VisualState x:Name="NonCritical"/>
<VisualState x:Name="Critical"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<i:Interaction.Triggers>
<ei:DataTrigger Binding="{Binding IsCritical}" Value="False">
<ei:GoToStateAction StateName="NonCritical"/>
</ei:DataTrigger>
<ei:DataTrigger Binding="{Binding IsCritical}" Value="True">
<ei:GoToStateAction StateName="Critical"/>
</ei:DataTrigger>
</i:Interaction.Triggers>
</Border>
当 IsCritical 属性设置 UI 元素加载后 时,它可以完美运行,但问题是,我需要该元素, 以 正确 VisualState 加载;我的意思是,
IsCritical = true => 元素以临界状态加载
IsCritical = false => 元素加载到 NonCritical 状态
通过 C# 代码隐藏文件是可行的,您可以为您的元素编写一个加载的事件处理程序,通过检查相应的 DataContext 属性来设置视觉状态。我想知道如何使用纯 XAML 来实现这一点。
顺便说一下,ei 和 i 指向这些 XML 命名空间:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
谢谢。
【问题讨论】:
-
IsCritical 是一个 source 属性,应该在视图模型或控件本身中以编程方式实现和设置。不要在 XAML 中设置 DataTrigger 的源属性。它属于您的 Control 类还是属于什么?
-
@mm8 是的,它是我的 ViewModel 的一个属性,应该管理状态
-
那么你应该在视图模型中设置属性的默认值。看我的回答。尝试为视图中的源属性设置默认值是没有意义的。
-
@mm8 恐怕我猜你错了,我想以编程方式更改 IsCritical 属性,我不想设置默认值!问题是,这些绑定表达式,不要读取其目标的初始值!我的意思是,如果您的视图模型将 IsCritical 设置为 true,则不会触发此条件的绑定!但是,当您在构建并显示 UI 元素后更改属性的值时,绑定会触发。
-
@EdPlunkett 我真的很想听 :) 为什么你认为我不想学习?!你有什么建议?我应该怎么做才能让我的视图初始化为正确的视觉状态?