Использовать переменную пространства имен для индексации в x: Bind? - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь привязать значения, определенные в словаре ViewModel, к тексту в XAML, но ключом словаря является перечисление в другом пространстве имен (происходящее из интерфейса C ++ / WinRT), и, похоже, я не могу используйте пространства имен в индексаторе диктанта позади (использование переменной пространства имен в качестве обычного параметра функции в XAML работает).

Модифицированный XAML:

<TextBlock Text="{x:Bind GetOptionName(winrt:OptionsEnum.OptionA)}">

Просмотр кода позади:

private string GetOptionName(OptionsEnum option) => ViewModel.OptionNames[option];

Но запись вспомогательные методы везде, где мне нужно что-то вроде этого, кажется очень утомительным, есть ли способ сделать прямое использование словаря виртуальных машин возможным?

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Вы не можете напрямую использовать словарь в xaml для привязки со свойством Text, вы можете использовать Converter или ваш вспомогательный метод GetOptionName(). Если вы не хотите писать вспомогательные методы при попытке связать их со словарем, вы можете поместить их в свою модель представления вместо страницы. В этом случае вам не нужно каждый раз объявлять метод и просто вызывать ViewModel.GetOptionName() для привязки.

Метод преобразования:

public class DictionaryConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
      object parameter, string language)
    {
        OptionsEnum result;
        var aa = Enum.TryParse<OptionsEnum>(parameter.ToString(), out result);
        var dictionary = value as Dictionary<OptionsEnum, string>;

        return dictionary[result];
    }

    public object ConvertBack(object value, Type targetType,
      object parameter, string language)
    {
        return null;
    }
}

. xaml:

<Grid>
    <TextBlock Text="{x:Bind ViewModel.OptionNames,Converter={StaticResource MyConverter},ConverterParameter=OptionA}"/>
</Grid>

Или Вспомогательный метод:

public class MyViewModel {
    ......
    public string GetOptionName(OptionsEnum option) => OptionNames[option];
}

.xaml:

<TextBlock Text="{x:Bind ViewModel.GetOptionName(winrt:OptionsEnum.OptionA)}"></TextBlock>
0 голосов
/ 12 марта 2020

После прочтения документации я понял, что хотя словари можно использовать в x: Bind, но только если они имеют строковый ключ ( ссылка ). Так что нет способа, чтобы он работал с перечислением, как я хочу.

...