在 x:Bind 中使用命名空间变量进行索引?

Use namespaced variable for indexing in x:Bind?

我尝试将 ViewModel 字典中定义的值绑定到 XAML 中的文本,但字典的键是另一个命名空间中的枚举(来自 C++/WinRT 接口),并且看来我不能在字典的索引器中使用命名空间。

XAML:

xmlns:winrt="using:Foo_WinRT"
...
<TextBlock Text="{x:Bind ViewModel.OptionNames[winrt:OptionsEnum.OptionA]}">

视图模型:

using Foo_WinRT;
...
IDictionary<OptionsEnum, string> OptionNames { get; }

我找到了一个解决方法,通过在后面的代码中使用辅助函数(在 XAML 中使用命名空间变量作为常规函数参数)。

已修改 XAML:

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

查看代码隐藏:

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

但是到处写辅助方法我需要这样的东西似乎很乏味,有什么办法可以直接使用VM字典吗?

您不能直接使用 xaml 中的字典来绑定文本 属性,您可以使用 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>

再次阅读文档后,我意识到虽然字典可以在x:Bind中使用,但前提是它们有一个字符串键(link)。所以它不可能像我想要的那样与枚举一起工作。