使用DataTemplate对象作为键,数据绑定到Dictionary <enum,string =“”>

时间:2017-12-01 09:23:31

标签: c# wpf xaml mvvm enums

使用其他几个问题,例如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标记在此非常重要。没有它们,我无法访问这些对象。

1 个答案:

答案 0 :(得分:1)

您只能将文字值传递给路径中的索引器。 如果要使用某个属性的值作为键从字典中动态选择项目,可以使用MultiBinding实现它。

<MultiBinding Converter="{StaticResource DictionaryAccessor}">
    <Binding Path="Dictionary" />
    <Binding Path="ObjectDataProperty" />
</MultiBinding>

DictionaryAccessorIMultiValueConverter一样,您必须编写以访问该元素。它的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;