XAML WinUI 3显示列表视图中的选定项目

8fsztsew  于 2023-05-21  发布在  其他
关注(0)|答案(1)|浏览(219)

我有一个WinUI 3项目使用模板工作室搭建。我有一个用枚举填充的列表视图。我想在另一个列表中显示所选项目,但绑定不起作用。
使用Enum填充,这意味着我使用具有枚举值和枚举描述的<key,value>对,并用作ItemsSource。选择模式多重激活。

public IEnumerable<KeyValuePair<string, string>> ValidationFlagsList => EnumExtensions.GetAllValuesAndDescriptions<ValidationFlag>();

//...
public static IEnumerable<KeyValuePair<string, string>> GetAllValuesAndDescriptions<TEnum>() where TEnum : struct, IConvertible, IComparable, IFormattable
{
    return typeof(TEnum).IsEnum ? (from e in Enum.GetValues(typeof(TEnum)).Cast<Enum>() select new KeyValuePair<string, string>(e.ToString(), e.GetDescription())) : throw new ArgumentException("TEnum must be an Enumeration type");
}
<ListView
        x:Name="FlagsListView"
        SelectionMode="Multiple"
        ItemsSource="{x:Bind ViewModel.ValidationFlagsList, Mode=OneTime}"
        SelectedValuePath="Key"
        DisplayMemberPath="Value">
</ListView>

在xaml的另一部分中,我想显示所选的项目。我尝试了两种变体:

1.

<ListView ItemsSource="{Binding SelectedItems, ElementName=FlagsListView, Mode=OneWay}"/>

2.

<StackPanel DataContext="{Binding SelectedItems, ElementName=FlagsListView}">
    <TextBlock Text="{Binding}"/>
</StackPanel>

UI上没有显示任何内容。如何正确绑定?
是因为IEnumerable是静态的,需要ObservableCollection吗?但是xamlListView应该给予我一些简单的绑定。文档指向此Data binding。我读到了关于创建一个具有IsSelected属性的类的内容,但我只需要一个只读列表,最好只在xaml中添加一些东西。

fkaflof6

fkaflof61#

ListView确实有一个SelectedItems属性,但它只是一个普通属性,而不是DependencyProperty。不幸的是,你不能使用它与绑定。
你可以做的是创建一个自定义的ListView

ListViewEx.cs

using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using System.Collections;
using System.Collections.Generic;

namespace ListViews;

public class ListViewEx : ListView
{
    public ListViewEx() : base()
    {
        this.SelectionChanged += ListViewEx_SelectionChanged;
    }

    public new IList SelectedItems
    {
        get => (IList)GetValue(SelectedItemsProperty);
        set => SetValue(SelectedItemsProperty, value);
    }

    public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.Register(
        nameof(SelectedItems),
        typeof(IList),
        typeof(ListViewEx),
        new PropertyMetadata(new ObservableCollection<object>()));

    private void ListViewEx_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        foreach (object item in e.RemovedItems)
        {
            SelectedItems.Remove(item);
        }

        foreach (object item in e.AddedItems)
        {
            SelectedItems.Add(item);
        }
    }
}

然后像这样使用它:

<Grid ColumnDefinitions="*,*">
    <local:ListViewEx
        x:Name="FlagsListView"
        Grid.Column="0"
        DisplayMemberPath="Value"
        ItemsSource="{x:Bind ViewModel.ValidationFlagsList, Mode=OneTime}"
        SelectedValuePath="Key"
        SelectionMode="Multiple" />

    <ListView
        Grid.Column="1"
        ItemsSource="{x:Bind FlagsListView.SelectedItems, Mode=OneWay}" />
</Grid>

相关问题