7

下面的代码显示了一个 CollectionView 的简单示例。我没有收到 SelectionChangedCommand 的事件。有人可以看到我做错了什么吗?

顺便说一句,完整的源代码可以在 GitHub 上找到

主页.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 xmlns:local="clr-namespace:ControlDemo"
                 x:Class="ControlDemo.MainPage">

    <StackLayout>
        <CollectionView SelectionMode ="Single"
                        ItemsSource="{Binding Tags}"
                        SelectionChangedCommand="{Binding SelectedTagChanged}">
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <StackLayout>
                        <Label Text="{Binding .}" />
                    </StackLayout>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
    </StackLayout>

</ContentPage>

MainPageModel.cs

public class MainPageModel : FreshBasePageModel
{
    public override void Init(object initData)
    {
        Tags = new List<string>() { "A", "B", "C" };
        base.Init(initData);
    }

    public List<string> Tags { get; set; }

    public Command SelectedTagChanged
    {
        get
        {
            return new Command(() =>
            {
            });
        }
    }
}
4

6 回答 6

11

在我身边有用的几件事(除了SelectionMode = Single):

  • 确保您的 Command 签名<object>在您的 PageModel 中,并根据您的需要进行任何转换(特别是如果您的收藏变得更加复杂)。

  • 同样在您的 XAML 中,您希望为 CollectionView 命名并使用 SelectedItem 属性。 SelectionChangedCommandParameter="{Binding SelectedItem, Source={x:Reference cvTagsCollectionView}}"

于 2019-12-04T03:49:49.233 回答
5

我使用您的代码并在我这边创建了一个演示,我添加了widthRequestandHeightRequest以使 collectionView 工作:

 <CollectionView            
              HeightRequest="170" 
              WidthRequest="200"                        
              SelectionMode="Single" 
              SelectionChangedCommand="{Binding SelectedTagChangedCommand}"
              ItemsSource="{Binding Tags}"      
         >

SelectionChangedCommand我单击 CollectionView 中的不同项目后触发了。

我在这里上传了一个示例,您可以查看它:collectionView-selectItemChanged-xamarin.forms

于 2019-06-27T05:40:14.730 回答
1

我以这种方式改进了 Fabricio P. 的答案:

  • 将 {RelativeSource Self} 用于 SelectionChangedCommandParameter。它有助于省略命名集合视图。

所以你的 xaml 部分将是这样的:


<CollectionView
    ItemsSource="{Binding Objects}"
    SelectionMode="Single"
    SelectionChangedCommand="{Binding SelectObjectCommand}"
    SelectionChangedCommandParameter="{Binding SelectedItem, Source={RelativeSource Self}}">

在您的视图模型中:

public ICommand SelectObjectCommand => new Command<string>(i => { Debug.WriteLine("Selected: " + i); });
public IEnumerable<string> Objects { get; set; }
于 2021-11-24T09:11:48.343 回答
1

如果你想使用你的 ViewModel,那么你应该使用 SelectedItem 的绑定:

<CollectionView ItemsSource="{Binding Monkeys}"
                SelectionMode="Single"
                SelectedItem="{Binding SelectedMonkey, Mode=TwoWay}">
    ...
</CollectionView>

并且,在您的 ViewModel 中:

Monkey selectedMonkey;
    public Monkey SelectedMonkey
    {
        get
        {
            return selectedMonkey;
        }
        set
        {
            if (selectedMonkey != value)
            {
                selectedMonkey = value;
            }
        }
    }

因此,每次您选择一个新对象时,SelectedMonkey 都会更新。

如果您想跟踪 SelectionChanged,那么,它应该在代码隐藏中(不确定如何在视图模型中实现,文档中对此一无所知)

<CollectionView ItemsSource="{Binding Monkeys}"
                SelectionMode="Single"
                SelectionChanged="OnCollectionViewSelectionChanged">
    ...
</CollectionView>

并且,在您的 Page.xaml.cs 中:

void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var previous = e.PreviousSelection;
    var current = e.CurrentSelection;
    ...
}
于 2019-06-26T14:27:50.210 回答
1

看起来您没有设置 SelectionMode 属性。根据文档

默认情况下,CollectionView 选择被禁用。但是,可以通过将 SelectionMode 属性值设置为 SelectionMode 枚举成员之一来更改此行为:

  • 无 - 表示无法选择项目。这是默认值。
  • Single - 表示可以选择单个项目,选中的项目被突出显示。
  • 多个 - 表示可以选择多个项目,并突出显示选定的项目。

添加SelectionMode = Single到 CollectionView 将解决您的问题。

于 2019-06-26T13:57:18.213 回答
0

如果您正在使用模型,则可以使用以下方法

我的 C# 模型视图类

public class MainView : INotifyPropertyChanged
{
    public ICommand SelectionChangedCommands => new Command<GroupableItemsView>((GroupableItemsView query) =>
    { 
        GO_Account test = query.SelectedItem as GO_Account; 
    });

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    } 
    
}

这是我的 XAML

<CollectionView  x:Name="myAccounts" 
    SelectionMode="Single" 
    ItemsSource="{Binding Products}" 
    SelectionChangedCommand="{Binding SelectionChangedCommands}"
    SelectionChangedCommandParameter="{Binding Source={x:Reference myAccountsModel}}">
</CollectionView>
于 2021-06-29T15:07:47.340 回答