【发布时间】:2016-12-15 16:08:50
【问题描述】:
我在 WPF 中有以下 MenuItem:
<MenuItem
x:Name="Menu1"
ItemsSource="{Binding ListOfObject1}" Visibility="{Binding ListOfObject1, Converter={u:NullToVisibleConverter}}"
>
<MenuItem.Style>
<Style>
<Setter
Property="Control.IsEnabled"
Value="true"
/>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition
Binding="{Binding PropertyInViewModel, Converter={baseTc:IsNullConverter} }"
Value="true"
/>
<Condition
Binding="{Binding ElementName=Menu1, Path=Items.BoolInObject1}"
Value="True"
/>
</MultiDataTrigger.Conditions>
<Setter
Property="Control.IsEnabled"
Value="False"
/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</MenuItem.Style>
</MenuItem>
所以如果属性PropertyInViewModel 为空并且属性BoolInObject1 为真,我希望我的MenuItem 为IsEnabled=false。 DataContext 设置为 ViewModel。对象Object1 在别处定义。所以基本上我的第二个条件不起作用,即我需要从 itemssource 访问项目/对象的属性以检查该项目是否启用。
有人可以解释一下我该怎么做吗?那么如何定义第二个条件以访问绑定到 ItemsSource 的对象的属性。
提前致谢。
【问题讨论】:
-
顺便说一句,如果这些是唯一的条件,您可以添加一个
Setter以默认禁用,然后添加两个单绑定 DataTriggers:一个启用如果PropertyInViewModel不是{x:Null}, 如果whatnot.BoolInObject1为假,则启用。以这种方式获得相同的布尔结果。 -
它是多数据触发器而不是多绑定,我认为我不需要多转换器,因为我已经指定了条件,是吗? Object1 是一个公共类,在我的解决方案中定义。所以当然它是由 ListOfObject1 引用的,即它是列表的类型。
-
哎呀,你是对的。无需多路转换器。
-
等一下,这里的目标是什么?此 MenuItem 是具有多个子菜单项的父项,
Items中的每个项对应一个。您想根据视图模型的某些属性启用/禁用父级,和...其中一个子级的某些属性?哪个孩子?还是全部? -
好吧,也许这就是问题所在。我想根据属性禁用子项(itemssources 对象)。如果列表为空,则父级将不可见。我以为孩子会继承样式,而父母没有 boolinobject1 属性,但这可能是错误的......