Binding 转换器的资源
Resources with Binding's Converter
我有几个不同语言的字符串资源。如您所见,所有这些都以大写字母开头,然后是小写字母。那么,有没有办法在不直接更改资源的情况下将它们全部转换为大写?是否可以在 XAML 内完成?也许是 Binding 转换器的组合?
你自己说出了答案。使用转换器。
Public Namespace Converter
Public Class ToUpperValueConverter
Implements IValueConverter
Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object
Dim str = TryCast(value, String)
Return If(String.IsNullOrEmpty(str), String.Empty, str.ToUpper())
End Function
Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object
Return Nothing
End Function
End Class
编辑
要使用此转换器,您需要使用某种绑定到您的 属性 而不是通常的 x:Uid
方式。您不能直接绑定到资源。相反,您需要将资源转换为某种形式的代码隐藏并通过您的 ViewModel 绑定它。这个SO answer will walk you through the steps. But instead of the PublicResXFileCodeGenerator
tool, you may have to use something like ResW File Code Generator
恐怕没有办法在纯 XAML 中做到这一点。
这是同一事物的 C# 版本:
public class ToUpperConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
string stringValue = value as string;
return string.IsNullOrEmpty(stringValue) ? string.Empty : stringValue.ToUpper();
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotSupportedException();
}
}
要在 XAML 中引用它:
<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1">
<Page.Resources>
<local:ToUpperConverter x:Key="UpperCaseConverter" />
</Page.Resources>
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Text="{x:Bind MyString, Converter={StaticResource UpperCaseConverter}}" />
</StackPanel>
</Page>
为了完整起见,这是 属性 我 x:Bind
到:
public sealed partial class MainPage
{
public string MyString => "Hello world!";
public MainPage()
{
InitializeComponent();
}
}
编辑
在 OP 的评论中,@RaamakrishnanA 询问这可能如何与资源一起使用。有点间接是一种方法。
在 .resw
文件中,为 Tag
属性:
提供一个值
<data name="HelloWorld.Tag">
<value>Hello, world!</value>
</data>
现在使用 x:Uid
将其绑定到 TextBlock
的 Tag
属性,然后将 Text
属性 绑定到标签,允许我们使用转换器:
<TextBlock
x:Name="textBlock"
x:Uid="HelloWorld"
Text="{Binding Tag, ElementName=textBlock, Converter={StaticResource UpperCaseConverter}}"
/>
输出:
我有几个不同语言的字符串资源。如您所见,所有这些都以大写字母开头,然后是小写字母。那么,有没有办法在不直接更改资源的情况下将它们全部转换为大写?是否可以在 XAML 内完成?也许是 Binding 转换器的组合?
你自己说出了答案。使用转换器。
Public Namespace Converter
Public Class ToUpperValueConverter
Implements IValueConverter
Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object
Dim str = TryCast(value, String)
Return If(String.IsNullOrEmpty(str), String.Empty, str.ToUpper())
End Function
Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object
Return Nothing
End Function
End Class
编辑
要使用此转换器,您需要使用某种绑定到您的 属性 而不是通常的 x:Uid
方式。您不能直接绑定到资源。相反,您需要将资源转换为某种形式的代码隐藏并通过您的 ViewModel 绑定它。这个SO answer will walk you through the steps. But instead of the PublicResXFileCodeGenerator
tool, you may have to use something like ResW File Code Generator
恐怕没有办法在纯 XAML 中做到这一点。
这是同一事物的 C# 版本:
public class ToUpperConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
string stringValue = value as string;
return string.IsNullOrEmpty(stringValue) ? string.Empty : stringValue.ToUpper();
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotSupportedException();
}
}
要在 XAML 中引用它:
<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1">
<Page.Resources>
<local:ToUpperConverter x:Key="UpperCaseConverter" />
</Page.Resources>
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Text="{x:Bind MyString, Converter={StaticResource UpperCaseConverter}}" />
</StackPanel>
</Page>
为了完整起见,这是 属性 我 x:Bind
到:
public sealed partial class MainPage
{
public string MyString => "Hello world!";
public MainPage()
{
InitializeComponent();
}
}
编辑
在 OP 的评论中,@RaamakrishnanA 询问这可能如何与资源一起使用。有点间接是一种方法。
在 .resw
文件中,为 Tag
属性:
<data name="HelloWorld.Tag">
<value>Hello, world!</value>
</data>
现在使用 x:Uid
将其绑定到 TextBlock
的 Tag
属性,然后将 Text
属性 绑定到标签,允许我们使用转换器:
<TextBlock
x:Name="textBlock"
x:Uid="HelloWorld"
Text="{Binding Tag, ElementName=textBlock, Converter={StaticResource UpperCaseConverter}}"
/>
输出: