gpt4 book ai didi

c# - 从 View 模型绑定(bind)到 ListView 项目点击属性

转载 作者:可可西里 更新时间:2023-11-01 03:14:06 27 4
gpt4 key购买 nike

我正在尝试使用 itemtapped 属性将事件绑定(bind)到菜单页面上的 ListView。目前我在我的应用程序中使用 MVVM (Xamarin form labs) 框架。我想要完成的是当用户点击应用程序导航到正确 View 的菜单项时。

这是xaml代码:

<ListView x:Name="list"
ItemsSource="{Binding MenuItems}"
SelectedItem="{Binding SelectedItem}"
ItemTapped= SET-BINDING-HERE >
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ViewCell.View>
//setup template here
</ViewCell.View>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

我想将 itemtapped 事件绑定(bind)到这个函数:

public void NavigateTo(object sender, ItemTappedEventArgs args)
{
var test = args.Item as MenuModel;
cPageTypes.GetByKey(test.CommandParameter)
.SwitchRootPage(AIMCore.ViewModels.ElliottBaseViewModel.MasterPage);
list.SelectedItem = null;
AIMCore.ViewModels.BaseViewModel.MasterPage.IsPresented = false;
}

如果我将函数添加到 View 的代码后面,然后设置 ItemTapped='NavigatTo',我目前可以让它工作,但这似乎是错误的,因为它违背了 MVVM 概念。我真正想做的是将事件绑定(bind)到我的 ViewModel 中的相同功能,如下所示:

<ListView x:Name="list"
ItemsSource="{Binding MenuItems}"
SelectedItem="{Binding SelectedItem}"
ItemTapped= "{Binding NavigateTo}" > // this binding is to the ViewModel

但是这不起作用或者我没有正确执行。当我尝试以这种方式实现它时,代码会产生错误。

错误:Xamarin.Forms.Xaml.XamlParseException:在 Xamarin.Forms.Xaml.BaseValueNode.SetPropertyValue 中找不到名称 ItemTapped 的属性

最佳答案

我遵循相同的体系结构并通过创建自定义列表控件并使用命令创建了 1 个可绑定(bind)属性,我使用以下代码在我的 View 模型中覆盖了该属性:

我的 PCL 中的自定义控件 [.cs] 页面

using System;
using System.Windows.Input;
using Xamarin.Forms;


namespace YourNS {

public class ListView : Xamarin.Forms.ListView {

public static BindableProperty ItemClickCommandProperty = BindableProperty.Create<ListView, ICommand>(x => x.ItemClickCommand, null);


public ListView() {
this.ItemTapped += this.OnItemTapped;
}


public ICommand ItemClickCommand {
get { return (ICommand)this.GetValue(ItemClickCommandProperty); }
set { this.SetValue(ItemClickCommandProperty, value); }
}


private void OnItemTapped(object sender, ItemTappedEventArgs e) {
if (e.Item != null && this.ItemClickCommand != null && this.ItemClickCommand.CanExecute(e)) {
this.ItemClickCommand.Execute(e.Item);
this.SelectedItem = null;
}
}
}
}

我的 XAML 页面

<ContentPage ...
xmlns:local="clr-namespace:Samples.Views;assembly=Your Assebly Name">

<local:ListView ItemClickCommand="{Binding Select}"
ItemsSource="{Binding List}">

在我的 View 模型中[在这个例子中,我只打开了对话框操作表

private Command<Signature> selectCmd;
public Command<Signature> Select {
get {
this.selectCmd = this.selectCmd ?? new Command<Signature>(s =>
this.dialogs.ActionSheet(new ActionSheetConfig()
.Add("View", () => {
if (!this.fileViewer.Open(s.FilePath))
this.dialogs.Alert(String.Format("Could not open file {0}", s.FileName));
})
.Add("Cancel")
)
);
return this.selectCmd;
}
}

关于c# - 从 View 模型绑定(bind)到 ListView 项目点击属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26040652/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com