Xamarin表单-CollectionView不触发SelectionChangedCommand

时间:2019-06-26 13:42:54

标签: xamarin xamarin.forms freshmvvm

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

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

MainPage.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(() =>
            {
            });
        }
    }
}

5 个答案:

答案 0 :(得分:2)

对我有用的事物(除了SelectionMode = Single之外):

  • 确保您的CommandModel的Command签名为<object>,并根据需要进行任何强制转换(特别是如果您的集合变得更复杂时)。

  • 在您的XAML上,您还想给CollectionView一个名称并使用SelectedItem属性。 SelectionChangedCommandParameter="{Binding SelectedItem, Source={x:Reference cvTagsCollectionView}}"

答案 1 :(得分:0)

您似乎没有设置SelectionMode属性。根据{{​​3}}:

  

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

     
      
  • 无-表示无法选择项目。这是默认值。
  •   
  • 单项–表示可以选择一个项目,突出显示所选项目。
  •   
  • 多个-表示可以选择多个项目,突出显示所选项目。
  •   

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

答案 2 :(得分:0)

如果要使用ViewModel,则应对SelectedItem使用Binding:

<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,则应该在代码的后面(不确定如何在viewmodel中实现,而在文档中什么也没有)

<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;
    ...
}

答案 3 :(得分:0)

我使用您的代码并在自己的身边创建了一个演示,我添加了widthRequestHeightRequest以使collectionView起作用:

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

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

我在此处上传了一个示例,您可以检查它:collectionView-selectItemChanged-xamarin.forms

答案 4 :(得分: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>