下面的代码显示了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(() =>
{
});
}
}
}
答案 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)
我使用您的代码并在自己的身边创建了一个演示,我添加了widthRequest
和HeightRequest
以使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>