使用其他几个问题,如this one。我发现了如何从xaml绑定到Dictionary<Enum, string>,如下所示:
{Binding Path=Dictionary[ (namespace:EnumModel) EnumValue ]}但是,当我引入一个DataTemplate并尝试使用对象数据属性来代替EnumValue时,我的问题就出现了。我正试图实现这样的目标:
{Binding Path=Dictionary[ (namespace:EnumModel) ObjectDataProperty ]}我将这种方法用于动态布局,将Enum属性转换为具有更适当格式的string值,如果能提供任何帮助,我们将不胜感激。
答案:
感谢帕维尔,这是最后的产品:
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标记是必不可少的。没有它们,我无法访问对象。
发布于 2017-12-01 09:56:59
只能向路径中的索引器传递一个文字值。如果您想使用某个属性值作为键动态地从字典中选择一个项,可以使用MultiBinding实现它。
<MultiBinding Converter="{StaticResource DictionaryAccessor}">
<Binding Path="Dictionary" />
<Binding Path="ObjectDataProperty" />
</MultiBinding>DictionaryAccessor是IMultiValueConverter,您必须写入它才能访问该元素。其转换方法将类似于以下内容:
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;https://stackoverflow.com/questions/47590180
复制相似问题