【问题标题】:WPF Binding to dictionary with x:Name as a keyWPF 绑定到以 x:Name 作为键的字典
【发布时间】:2017-03-23 21:31:59
【问题描述】:

如果不清楚,请更正我的问题。我正在寻找的是..

这是一个字典的示例绑定......它有效:

<TextBlock Text="{Binding Path=MyDictionary[ThisIsKeyInMyDict]}" />

我正在寻找:

<TextBlock x:Name="Id" Text="{Binding Path=MyDictionary[x:Name]}" />

你看到了吗?我想在字典中查找一个键,与此控件的“名称”相同。

感谢您的帮助!

【问题讨论】:

  • 你试过Text="{Binding Path=MyDictionary[x&amp;#58;Name]}" 吗?冒号是一个特殊字符,可能需要转义。
  • 我的代码气味感觉刺痛...这是一个 X/Y 问题。您有一个目标,但是您尝试使用的方法不正确/比推荐的模式更难使用。绑定字典是代码异味的一部分(呃,请不要)。如果您edit 并清楚地描述您要做什么,您可能会得到更好的答案。如果您创建一个绝对精简的准系统原型应用程序来展示您正在尝试做的事情 (mcve),您将获得最好的答案。
  • @Will 感谢您的建议!我在这里问了一个更复杂的问题:stackoverflow.com/q/43006104/7727517 这个问题的范围是为了缩小范围以在此处添加更多细节。

标签: c# .net wpf xaml mvvm


【解决方案1】:

您可以为它使用 MultiBinding:

   <Window.Resources>
        <local:DictValueConverter x:Key="dictValCnv"/>        
    </Window.Resources>
<TextBlock.Text>
    <MultiBinding Converter="{StaticResource dictValCnv}">
        <Binding Path="MyDictionary"/>
        <Binding RelativeSource="{RelativeSource Self}" Path="Name"/>
    </MultiBinding>
</TextBlock.Text>


using System;
using System.Globalization;
using System.Linq;
using System.Windows.Data;
public class DictValueConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values==null || values.Length<2 )
        {
            return false;
        }

        var dict = values[0] as IDictionary;
        if(dict.Contains(values[1]))
    {
        return dict[values[1]];
    }
        return "KeyNotFound";
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 2011-02-28
    • 2011-01-23
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    相关资源
    最近更新 更多