XAML 使用父命令访问集合视图中的当前项

ogsagwnx  于 2023-05-04  发布在  其他
关注(0)|答案(1)|浏览(166)

我有一个MAUI前端,连接到一个按钮成功地从虚拟机与

Command="{Binding BindingContext.ImageCreateCommand, Source={x:Reference PageName}}

完整的MAUI命令位于集合视图中,例如

<CollectionView Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="9" VerticalOptions="FillAndExpand" 
                    ItemsSource="{Binding class}">
                    <CollectionView.ItemTemplate>
                        <DataTemplate x:DataType="models:class">
...
    <Button Text="Add" Grid.Column="0" Command="{Binding BindingContext.ImageCreateCommand, Source={x:Reference WorkNotification}}" CommandParameter="{Binding id}"></Button>
    <Label TextColor="{DynamicResource SecondaryTextColor}" Grid.Column="1" Text="{Binding id}" Style="{DynamicResource ContentLabel}"/>
    <Label TextColor="{DynamicResource SecondaryTextColor}" Grid.Column="2" Text="{Binding txt}" Style="{DynamicResource ContentLabel}"/>
..

我想在集合视图中使用CommandParameter="{Binding id},这样我就可以使用该id执行某些操作,但当我将其放入按钮CommandParameter中时没有成功
我的视图模型是这样的:

public ObservableRangeCollection<class> class { get; } = new();

public viewmodel(string funcLoc)
    {
        ImageCreateCommand = new Command(async () =>
        {
           Console.WriteLine(id);
        }
    };

文档说你可以将CommandParameter属性设置为任意数据,以区分多个按钮,如果它们都绑定到视图模型中的同一ICommand属性,这是因为CollectionView可以看到id并显示它。
如何将集合视图中的项用作此命令中的参数。

5tmbdcev

5tmbdcev1#

很难从问题的当前状态推断出问题出在哪里,但无论如何,我将提供一个通用的答案。
如果您有一个项目集合,并且希望将它们或它们的任何属性用作 CommandParameter,则可以按以下方式执行此操作。
在ViewModel中,你有一个集合,假设是一个ObservableCollection<MyItem>,其中MyItem定义如下:

public class MyItem
{
    public int Index { get; set; }
    public string Id { get; set; }
}

你的ViewModel,让我们称之为MyViewModel也有一个 Command,让我们称之为MyCommand,它接受一个string作为参数,那么它看起来像这样:

public class MyViewModel : ObservableObject
{
    private ObservableCollection<MyItem> items;
    public ObservableCollection<MyItem> Items
    {
        get => items;
        set => SetProperty(ref items, value);
    }

    private IRelayCommand<string> myCommand;
    public IRelayCommand<string> MyCommand => myCommand ??= new RelayCommand<string>(MyMethod);

    private void MyMethod(string id)
    {
        Console.WriteLine(id);
    }
}

在XAML中,可以设置一个<CollectionView>,在其中可以引用MyCommand命令并将Id属性作为参数传递。
这需要您将MyViewModel的示例设置为BindingContext,例如在视图或页面的代码隐藏中:

public partial class MyPage : ContentPage
{
    public MyPage()
    {
        InitializeComponent();
        BindingContext = new MyViewModel();
    }
}

然后,在MyPage的XAML中,您可以使用Relative Binding设置<CollectionView>Command 绑定到ViewModel:

<CollectionView
    ItemsSource="{Binding Items}">
    <CollectionView.ItemTemplate>
        <DataTemplate x:DataType="models:MyItem">
            <Button
                Text="{Binding Id}"
                Command="{Binding MyCommand, Source={RelativeSource AncestorType={x:Type viewmodels:MyViewModel}}"
                CommandParameter="{Binding Id}" />
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

相关问题