在XAML中为MenuItem设置Source

时间:2016-03-14 23:02:20

标签: c# wpf xaml data-binding menuitem

我有Menu MenuItemRegionType枚举。{ MenuItems应该有复选标记,我想将IsChecked绑定到某些ObservableCollection<bool>VisibleRegions):

<ObjectDataProvider x:Key="enumData" MethodName="GetValues" ObjectType="{x:Type System:Enum}">
    <ObjectDataProvider.MethodParameters>
        <x:Type TypeName="target:RegionType"/>
    </ObjectDataProvider.MethodParameters>
</ObjectDataProvider>

菜单本身:

<Menu>
    <MenuItem Header="Choose item" ItemsSource="{Binding Source={StaticResource enumData}}">
        <MenuItem.ItemContainerStyle>
            <Style TargetType="MenuItem">
                <Setter Property="IsCheckable" Value="True"/>
                <Setter Property="IsChecked" Value="{Binding VisibleRegions, Mode=TwoWay}"/>
                <Setter Property="StaysOpenOnClick" Value="True"/>
            </Style>
        </MenuItem.ItemContainerStyle>
    </MenuItem>
</Menu>

VS输出在运行时告诉我:

  

System.Windows.Data错误:40:BindingExpression路径错误:   'object'''RegionType'上找不到'VisibleRegions'属性   (的HashCode = 0)”。 BindingExpression:路径= VisibleRegions;   DataItem ='RegionType'(HashCode = 0);目标元素是'MenuItem'   (名称= ''); target属性是'IsChecked'(类型'Boolean')

信息很清楚,但我该如何纠正这个xaml片段?

1 个答案:

答案 0 :(得分:1)

在绑定到集合时,xaml中没有直接获取当前索引的方法。

所以,你应该做的是绑定到一个类的ObservableCollection,它将枚举值与bool(IsChecked)结合起来。例如:

public class EnumData
{
    public string Enum { get; set; }
    public bool IsChecked { get; set; }
}


var enumData = new ObservableCollection<EnumData> (Enum.GetNames(typeof(YourEnum))
    .Select(s => new EnumData { Enum = s, IsChecked = false }));

然后只需将DisplayMemberPath设置为您想要显示的属性:

<Menu>
    <MenuItem Header="Choose item" ItemsSource="{Binding enumData}" DisplayMemberPath="Enum">
        <MenuItem.ItemContainerStyle>
            <Style TargetType="MenuItem">
                <Setter Property="IsCheckable" Value="True"/>
                <Setter Property="IsChecked" Value="{Binding IsChecked, Mode=TwoWay}"/>
                <Setter Property="StaysOpenOnClick" Value="True"/>
            </Style>
        </MenuItem.ItemContainerStyle>
    </MenuItem>
</Menu>