使用Binding转换器的资源

时间:2016-06-02 16:04:02

标签: xaml windows-phone win-universal-app uwp uwp-xaml

我有几种不同语言的字符串资源。正如您所看到的,所有这些都以大写字母开头,然后是小写字母。那么,有没有什么方法可以在不直接更改资源的情况下将所有这些转换为UPPERCASE?是否可以在XAML中执行此操作?也许结合Binding的转换器?

enter image description here

2 个答案:

答案 0 :(得分:1)

这是同一件事的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的评论中,@ RamakrishnanA询问这可能如何与资源配合使用。一点间接是一种方法。

.resw文件中,为Tag属性提供值:

<data name="HelloWorld.Tag">
  <value>Hello, world!</value>
</data>

现在使用x:Uid将其绑定到Tag的{​​{1}}属性,然后将TextBlock属性绑定到标记,允许我们使用转换器:< / p>

Text

输出:

enter image description here

答案 1 :(得分:0)

你自己说出了答案。使用转换器。

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会引导您完成这些步骤。但是,您可能必须使用类似ResW File Code Generator

的内容,而不是PublicResXFileCodeGenerator工具

我担心在纯XAML中无法做到这一点。