问题
我正在try 使用CollectionView
和MvvM
进行多项 Select .(official docs)在区分正常的代码隐藏和MVVM方面做得不是很好,对我们新手来说,这很糟糕.
我可以让单项 Select 工作,但要跳到多项 Select 是我做不到的.
我将展示我的单项 Select 工作代码,并讨论如何使其适用于多项 Select .也许有人比我知道得更多?
单选
以下是单项 Select 的工作代码:
将类型为Person
的ObservableCollection
传递给ModelView.声明一个Person
的实例,它将是"选定的对象".
namespace Sandbox.ViewModel;
[QueryProperty("Persons", "Persons")]
public partial class SelectPageViewModel : ObservableObject
{
[ObservableProperty]
private ObservableCollection<Person> persons;
[ObservableProperty]
private Person selectedPerson;
public SelectPageViewModel()
{
Persons = new();
}
}
在视图中,创建一个CollectionView
,并对其属性进行一些很好的猜测:
<Grid>
<Label Text="Select from List"/>
<CollectionView ItemsSource="{Binding Persons}"
SelectionMode="Single"
SelectedItem="{Binding SelectedPerson}"
SelectionChangedCommand="{Binding SelectionChangedCommand}">
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="model:Person">
<Grid>
<Label Text="{Binding Name}"/>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</Grid>
回到ViewModel中,SelectionChanged
命令:如果用户对他们 Select 的SelectedPerson
感到满意,我将它传递回它来自的页面,否则我将 Select 设为空并返回:
[RelayCommand]
private async Task SelectionChanged()
{
bool keepSelection = await App.Current.MainPage.DisplayAlert(SelectedPerson.Name, "Keep this selection?", "Yes", "No");
if (keepSelection)
{
Dictionary<string, object> throwParam = new()
{
{ "SelectedPerson", SelectedPerson }
};
await Shell.Current.GoToAsync("..", throwParam);
}
// else clear the selection and return
SelectedPerson = null;
return;
}
多项 Select
经过多次努力,下面是可用的代码.very important:注意集合绑定中使用的ObservableCollection
的类型(提示,它是Object
).
另一个编辑(我的当前代码)
我当前的代码与上面的代码相同,但我将显示全部的视图模型和视图,以及应该填充的列表的屏幕截图.
视图模型:
namespace Sandbox.ViewModel;
[QueryProperty("Persons","Persons")]
public partial class SelectPageViewModel : ObservableObject
{
[ObservableProperty]
private ObservableCollection<Person> persons;
[ObservableProperty]
private ObservableCollection<Object> selectedPersons;
[ObservableProperty]
private Person selectedPerson;
public SelectPageViewModel()
{
Persons = new();
SelectedPersons = new();
}
[RelayCommand]
private void SelectionChanged()
{
// every time something is selected, the object is added to SelectedPersons automagically.
int a = SelectedPersons.Count; // will +1 every time
}
}
观点:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:viewmodel="clr-namespace:Sandbox.ViewModel"
xmlns:model="clr-namespace:Sandbox.Model"
x:DataType="viewmodel:SelectPageViewModel"
x:Class="Sandbox.View.SelectPage"
Title="SelectPage">
<Grid RowDefinitions="Auto,Auto" Padding="10">
<Label Grid.Row="0"
Text="Select from List"
FontSize="Large"
FontAttributes="Bold" />
<CollectionView Grid.Row="1"
ItemsSource="{Binding Persons}"
SelectionMode="Multiple"
SelectedItems="{Binding SelectedPersons, Mode=TwoWay}"
SelectionChangedCommand="{Binding SelectionChangedCommand}">
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="model:Person">
<Grid Padding="10">
<Label Text="{Binding Name}"
FontSize="Medium" />
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</Grid>
</ContentPage>