我有Menu
MenuItem
个RegionType
枚举。{
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片段?
答案 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>