Xamarin.Forms XAML绑定到x:String

4
有没有一种方法可以从XAML动态分配Picker.Items?
类似于以下代码:
<Picker x:Name="pckTheme">
    <Picker.Items>
        <x:String>{Binding Option1Text}></x:String>
        <x:String>{DynamicResource Option2Text}></x:String>
    </Picker.Items>
</Picker>

(当然,这个示例是不起作用的)。

据我所知,在 Picker.Items 中唯一允许的类型是 x:String,并且我似乎找不到任何绑定到 x:String 的方法。

从代码中实现相对简单,但如果可能的话,我更喜欢直接从 XAML 中实现。

这里的目标是从资源文件本地化内容,但其他用途也可能很方便。


1
绑定值怎么样?这对你不起作用吗? - pinedax
这就是我试图做的事情。似乎对于<x:String>没有起作用。 - bocko
我认为你可以从资源文件中读取信息(字符串),并将其插入到列表中,然后将该列表绑定到Picker。 - pinedax
谢谢。这是我现在正在做的方式。但是我还需要从代码中处理运行时语言更改,这就是为什么我想从XAML中进行操作的原因。 - bocko
3个回答

1

通常,您需要将Picker绑定到一个可以动态更改的项目列表中。如果以硬编码的方式添加它们,则无法实现真正的动态分配。您可以创建一个ValueConverter来在XAML中使用,获取键的特定于语言的值,并将Picker绑定到键列表。


我正在尝试从XAML中获取尽可能多的信息。我的想法是,如果可以的话,使用资源中的{Strings.keyValue},这样本地化将由Xamarin.forms自己处理。因此,在我看来,这并不是硬编码。 - bocko

1
请使用以下 XAML 代码:
<x:Array Type="{x:Type x:String}">
<x:Static Member="local:AppResources.Events"/>
<x:Static Member="local:AppResources.Device"/>
<x:Static Member="local:AppResources.Biographical"/>
</x:Array>

local是什么:

xmlns:local="clr-namespace:YOURNAMESPACE"

0

<x:string> 只支持常量值。您可以使用 Markup Extension 解决此问题。

它的功能很简单:返回其参数。

using System;
using Xamarin.Forms.Xaml;

namespace YOURAPP.Extensions
{
    public class StringExtension : IMarkupExtension
    {
        public string Value { get; set; }

        public object ProvideValue(IServiceProvider serviceProvider)
        {
            return Value;
        }
    }
}

在视图中使用它:

  1. xmlns:ext="clr-namespace:YOURAPP.Extensions" 添加到根元素
  2. <ext:StringExtension Value="{anything here}" /> 替换原本的 <x:string>

请注意,这会导致对 IEnumerable 调用 Add。对于选择器,它可以直接工作。对于自定义控件,需要初始化(以避免 NullReferenceException)和 ObservableCollection 以确保在添加时更新视图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接