2016-03-14 100 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>