2016-03-14 3 views
0

У меня есть Menu с MenuItem s, которые связаны с RegionType перечислением.
MenuItems должен флажки, и я хочу занный IsChecked к некоторым ObservableCollection<bool> (VisibleRegions):Установить источник для MenuItem в XAML

<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 нет простого способа получить текущий индекс при привязке к коллекции.

Итак, вам следует привязать к классу 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> 
Смежные вопросы