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 将其绑定到 TextBlockTag 属性,然后将 Text 属性 绑定到标签,允许我们使用转换器:

<TextBlock
    x:Name="textBlock"
    x:Uid="HelloWorld"
    Text="{Binding Tag, ElementName=textBlock, Converter={StaticResource UpperCaseConverter}}"
/>

输出: