2016-03-14 96 views
0

我有一个MenuMenuItem s绑定到RegionType枚举。
的MenuItems应该有复选标记,我想结合IsChecked一些ObservableCollection<bool>VisibleRegions):在XAML中为MenuItem设置源

<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 Error: 40 : BindingExpression path error: 'VisibleRegions' property not found on 'object' ''RegionType' (HashCode=0)'. BindingExpression:Path=VisibleRegions; DataItem='RegionType' (HashCode=0); target element is 'MenuItem' (Name=''); target property is 'IsChecked' (type 'Boolean')

消息非常清楚,但是如何纠正这个xaml作品?

回答

1

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

因此,你应该做的是绑定到一个类,该类将枚举值与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>