首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据库到Dictionary<Enum,string>使用DataTemplate对象作为键

数据库到Dictionary<Enum,string>使用DataTemplate对象作为键
EN

Stack Overflow用户
提问于 2017-12-01 09:23:30
回答 1查看 295关注 0票数 0

使用其他几个问题,如this one。我发现了如何从xaml绑定到Dictionary<Enum, string>,如下所示:

代码语言:javascript
复制
{Binding Path=Dictionary[ (namespace:EnumModel) EnumValue ]}

但是,当我引入一个DataTemplate并尝试使用对象数据属性来代替EnumValue时,我的问题就出现了。我正试图实现这样的目标:

代码语言:javascript
复制
{Binding Path=Dictionary[ (namespace:EnumModel) ObjectDataProperty ]}

我将这种方法用于动态布局,将Enum属性转换为具有更适当格式的string值,如果能提供任何帮助,我们将不胜感激。

答案:

感谢帕维尔,这是最后的产品:

XAML:

代码语言:javascript
复制
<MultiBinding Converter="{StaticResource DictionaryAccessor}">
    <Binding Path="DataContext.Dictionary" RelativeSource="{RelativeSource AncestorType=UserControl}"/>
    <Binding Path="Data.ObjectProperty"/>
</MultiBinding>

转换器:

代码语言:javascript
复制
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标记是必不可少的。没有它们,我无法访问对象。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-01 09:56:59

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

代码语言:javascript
复制
<MultiBinding Converter="{StaticResource DictionaryAccessor}">
    <Binding Path="Dictionary" />
    <Binding Path="ObjectDataProperty" />
</MultiBinding>

DictionaryAccessorIMultiValueConverter,您必须写入它才能访问该元素。其转换方法将类似于以下内容:

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47590180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档