访问绑定到ItemsSource的对象的属性

时间:2016-12-15 16:08:51

标签: wpf mvvm binding

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

所以如果Property IsEnabled=false为null并且属性PropertyInViewModel为true,我希望我的MenuItem为BoolInObject1。 DataContext设置为ViewModel。对象Object1在别处定义。所以基本上我的第二个条件不起作用,即我需要从itemssource访问item / object的属性以检查是否启用了此项。 有人可以解释一下如何做到这一点吗?那么如何定义第二个条件以访问绑定到ItemsSource的对象的属性。 提前致谢。

1 个答案:

答案 0 :(得分:0)

子菜单项不会继承Style。将Style应用于子菜单项的方式是MenuItem.ItemContainerStyle,与ListBoxListView一样;所有这些类都从ItemsControl继承该属性以及ItemsSource属性和其他一些属性。

每个子菜单项都有一个ListOfObject1 DataContext项,因此绑定BoolInObject1很容易。绑定PropertyInViewModel更难,因为视图模型不会成为DataContext。但是,它是父DataContext的{​​{1}},您可以使用MenuItem通过可视树来访问它。

我还为子菜单项的{RelativeSource AncestorType=MenuItem}属性添加了一个setter;你自然需要改变被绑定的财产。我将Header添加到您的TargetType

Style