使用其他几个问题,例如this one。我已经找到了如何从xaml绑定到Dictionary<Enum, string>
,如下所示:
{Binding Path=Dictionary[ (namespace:EnumModel) EnumValue ]}
但是,一旦我引入DataTemplate
并尝试使用对象数据属性代替EnumValue
,我的问题就出现了。我正在努力实现这样的目标:
{Binding Path=Dictionary[ (namespace:EnumModel) ObjectDataProperty ]}
我正在使用这种方法进行动态布局,将Enum
属性转换为string
值,格式更合适,任何帮助都会非常感激。
解答:
感谢Pavel,这是最终产品:
XAML:
<MultiBinding Converter="{StaticResource DictionaryAccessor}">
<Binding Path="DataContext.Dictionary" RelativeSource="{RelativeSource AncestorType=UserControl}"/>
<Binding Path="Data.ObjectProperty"/>
</MultiBinding>
转换器:
public class DictionaryAccessor : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var dict = values[0] as Dictionary<EnumModel, string>;
var key = values[1] as EnumModel?;
return key != null && dict != null ? dict[key.Value] : null;
}
}
请务必注意Data.
字段中的DataContext.
和Binding
标记在此非常重要。没有它们,我无法访问这些对象。
答案 0 :(得分:1)
您只能将文字值传递给路径中的索引器。 如果要使用某个属性的值作为键从字典中动态选择项目,可以使用MultiBinding实现它。
<MultiBinding Converter="{StaticResource DictionaryAccessor}">
<Binding Path="Dictionary" />
<Binding Path="ObjectDataProperty" />
</MultiBinding>
DictionaryAccessor
与IMultiValueConverter
一样,您必须编写以访问该元素。它的Convert方法与此类似:
var dict = values[0] as IDictionary<EnumModel, SomeType>; // Replace SomeType with your real object type.
var key = values[1] as EnumModel?;
return key != null ? dict[key.Value] : null;