在 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)。所以它不可能像我想要的那样与枚举一起工作。
我尝试将 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)。所以它不可能像我想要的那样与枚举一起工作。