Вопрос по dictionary, wpf, binding – привязка словаря wpf, где ключ = переменная

4

У меня есть тестовый словарь

MyDict = new Dictionary<string, Uri>
{
    {"First", new Uri("alma.jpg", UriKind.Relative)},
    {"Second", new Uri("korte.jpg", UriKind.Relative)}
};

и простой XAML

<TextBlock Text="{Binding MyDict[First]}"
           FontSize="13" Width="200" Height="30" />

Это прекрасно показывает Первый ключевой элемент Значение

Я хочу, чтобы у меня была строковая переменная: DictKey Lets DictKey = "First"

Как переписать XAML для использования этой переменной

<TextBlock Text="{Binding MyDict[???DictKey????]}"
           FontSize="13" Width="200" Height="30" />

Спасибо.

Посмотри пожалуйстаВот о том, как форматировать блоки кода. Clemens

Ваш Ответ

1   ответ
13

Я полагаю, у вас есть собственностьDictKey который содержит ключ предмета. Вы можете использоватьMultiBinding и установите первую привязку к свойству словаря и вторую привязку к свойству с ключом элемента:

<TextBlock FontSize="13" Width="200" Height="30">
    <TextBlock.Text>
        <MultiBinding>
            <MultiBinding.Converter>
                <local:DictionaryItemConverter/>
            </MultiBinding.Converter>

            <Binding Path="MyDict"/>
            <Binding Path="DictKey"/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

Конвертер использует оба значения для чтения элемента из словаря:

public class DictionaryItemConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (values != null && values.Length >= 2)
        {
            var myDict = values[0] as IDictionary;
            var myKey = values[1] as string;
            if (myDict != null && myKey != null)
            {
                //the automatic conversion from Uri to string doesn't work
                //return myDict[myKey];
                return myDict[myKey].ToString();
            }
        }
        return Binding.DoNothing;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}
Большое спасибо, это работает. KusziWorks

Похожие вопросы