【问题标题】:WinRT ListView with itemsource as List<KeyValuePair<string, string>> error XAML (Windows 8.1 Universal App (XAML/C#))WinRT ListView with itemsource as List<KeyValuePair<string, string>> 错误 XAML(Windows 8.1 Universal App (XAML/C#))
【发布时间】:2014-08-22 13:36:35
【问题描述】:

我无法让它工作...(Windows 8 Universal App (XAML/C#) 项目) 我有一个绑定到 List >
的列表视图 这是代码:

                    <ListView 
                       ItemsSource="{Binding Languages}" 
                       SelectedItem="{Binding SelectedLanguage, Mode=TwoWay}"
                       >
                            <ListView.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Value}" FontSize="18" FontWeight="Light" />
                                </DataTemplate>
                            </ListView.ItemTemplate>
                        </ListView>

这是我的 C# 代码:

  private List<KeyValuePair<string, string>> _languages;
public List<KeyValuePair<string, string>> Languages
{
    get
    {
        if (_languages == null)
        {
            _languages = Utils.AvailableLanguages;
        }

        return _languages;
    }
}

public KeyValuePair<string, string> SelectedLanguage
{
    get
    {
        return Languages.SingleOrDefault(x => x.Key == Utils.CurrentLanguage);
    }
    set
    {
        Utils.CurrentLanguage = value.Key;
        Api.Localization = value.Key;
        RaisePropertyChanged(() => CurrentLanguage);
    }
}

在我的列表视图中,如果我执行“绑定值”,我什么也得不到(没有显示数据),但是如果我在没有 Value 元素的情况下进行绑定,它会同时显示我的列表的键和值:

<TextBlock Text="{Binding}" FontSize="18" FontWeight="Light" />

它告诉我这个:

我怎样才能让我只显示我的列表的值而不是键?谢谢你的帮助!

编辑: 如果我这样做:

<TextBlock Text="{Binding key}" FontSize="18" FontWeight="Light"  />

或者那个

<TextBlock Text="{Binding value}" FontSize="18" FontWeight="Light"  />

同样的错误,:

编辑2: Utils.AvailableLanguages 值:

【问题讨论】:

  • 嗯{绑定值}是个好东西。
  • {Binding key} 你得到了什么?
  • 我更新了我的问题,我得到一个带有键和/或值的空列表

标签: c# wpf xaml listview winrt-xaml


【解决方案1】:

绑定似乎确实无法提取属性值 - 可能是因为类型是通用的。这是您可以在 VS 输出窗口中看到的内容:

`A first chance exception of type 'System.Reflection.TargetException' occurred in mscorlib.dll
Error: Cannot get 'Value' value (type 'String') from type 'System.Runtime.InteropServices.WindowsRuntime.CLRIKeyValuePairImpl`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. BindingExpression: Path='Value' DataItem='System.Runtime.InteropServices.WindowsRuntime.CLRIKeyValuePairImpl`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'; target element is 'Windows.UI.Xaml.Controls.TextBlock' (Name='null'); target property is 'Text' (type 'String').

keyvalue 将是 KeyValuePair 的字段,而绑定仅适用于属性,因此不起作用。简单的解决方案是不使用KeyValuePair。相反,您应该创建自己的类来保存语言代码和国家/地区名称。如果它们都是唯一的 - 你可以简单地使用这样的字符串列表:

XAML

<Page
    x:Class="App51.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <ListView
            x:Name="lv">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock
                        Text="{Binding}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Page>

C#

using System.Collections.Generic;
using System.Linq;
using Windows.UI.Xaml.Controls;

namespace App51
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            var kvps = new List<KeyValuePair<string, string>>();
            kvps.Add(new KeyValuePair<string, string>("ar", "Argentina"));
            kvps.Add(new KeyValuePair<string, string>("au", "Australia"));
            kvps.Add(new KeyValuePair<string, string>("be-fr", "Belgique"));
            this.lv.ItemsSource = kvps.Select(kvp => kvp.Value).ToList();
        }
    }
}

如果值比键少 - 你必须做更多这样的事情:

XAML

<Page
    x:Class="App51.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <ListView
            x:Name="lv">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock
                        Text="{Binding Value}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Page>

C#

using System.Collections.Generic;
using System.Linq;
using Windows.UI.Xaml.Controls;

namespace App51
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            var kvps = new List<KeyValuePair<string, string>>();
            kvps.Add(new KeyValuePair<string, string>("ar", "Argentina"));
            kvps.Add(new KeyValuePair<string, string>("au", "Australia"));
            kvps.Add(new KeyValuePair<string, string>("be-fr", "Belgique"));
            this.lv.ItemsSource = kvps.Select(kvp => new { kvp.Key, kvp.Value }).ToList();
        }
    }
}

【讨论】:

    【解决方案2】:

    试试

    {Binding key} or {Binding value}
    

    你可以通过这个来减少代码

    get
    {
        return _languages ?? (_languages = Utils.AvailableLanguages);
    }
    

    【讨论】:

    • 感谢代码 reduce =),尝试 {Binding key} 或 {Binding value} 是我最初所做的,但 Visual Studio 告诉我在 Key 和/或 Value 处添加大写字母:@ 987654321@
    • 你是如何初始化属性的:AvailableLanguages?这就是我所做的:_availableLanguages = new List>() { new KeyValuePair("ar", "Argentina"), new KeyValuePair("au", "澳大利亚") bla bla bla
    • 我粘贴了您的代码,它也可以正常工作。我在 WPF 中检查了它,现在我注意到您在谈论 WinRT,所以显然它必须略有不同。
    • 是的,我在 Windows 8.1 通用应用程序 (XAML/C#) 中使用它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多