Xamarin表单ListView ItemTapped / ItemSelected在XAML上绑定命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xamarin表单ListView ItemTapped / ItemSelected在XAML上绑定命令相关的知识,希望对你有一定的参考价值。

如何将我的ViewModel(当前在BindingContext中)的ICommand对象绑定到XAML中ListView的ItemTapped或ItemSelected?

使用Button时这是一个简单的任务,我只需设置Command =“MyViewModelCommand”,一切正常。

答案

当您可以直接在ViewModel中直接获取所选/点击的对象时,我不确定您为什么需要在页面中提供“项目选定”或“项目点击”事件:

我认为你已经将listview与以下类型的代码绑定在一起

<ListView ItemsSource="{Binding PermitDetails}" 
SelectedItem="{Binding objItemSelected, Mode=TwoWay}" x:Name="lst" 
RowHeight="35" HorizontalOptions="FillAndExpand" 
VerticalOptions="Fill">

在您与页面绑定的视图模型中,您需要定义属性objItemSelected,如下面的代码所示

private Permit _ItemSelected;
public Permit objItemSelected {
    get {
        return _ItemSelected;
    }
    set {
        if (_ItemSelected != value) {
            _ItemSelected = value;
            OnPropertyChanged ("ItemSelected");
        }
    }
}

如果要执行任何其他功能(如导航到详细信息页面),可以在执行OnPropertyChanged语句后从set属性执行此操作。

希望这可以帮助!

另一答案

我的场景是键盘,图像是按钮,当单击一个按钮时,相关字符将显示在标签中。

所以..

让我们说你有跟随控制(键1):

<Image  x:Name="imgKey1"
        Source="key1.png"
        Aspect="AspectFit" />

并且您希望在轻触图像时从您的“viewModel”对象触发命令。我的“viewModel”具有以下属性:

public ICommand AddCharCommand { protected set; get; }

在我的类(视图模型)构造函数中我有:

  this.AddCharCommand = new Command<string>((key) =>
            {
                // Add the key to the input string.
                this.InputString += key;
            });

“InputString”是一个字符串属性......

所以为了绑定视图和模式,我正在做以下事情:

  imgKey1.GestureRecognizers.Add(new TapGestureRecognizer
        {
            Command = viewModel.AddCharCommand,
            CommandParameter = "1",
        });

我希望我帮助你,如果有人需要什么,我可以提供帮助;我在这里......在那里。 JJ

在XAML 17-11-14

      <Image  Source="n1normal.png"
              Aspect="AspectFit" >
        <Image.GestureRecognizers>
          <TapGestureRecognizer
            Command="{Binding AddCharCommand}"
            CommandParameter ="1"/>
        </Image.GestureRecognizers>
      </Image>

//-OR-

        <Image Source="magnifyglass.png"
               Aspect="AspectFit"
               HorizontalOptions="End">
          <Image.GestureRecognizers>
            <TapGestureRecognizer Tapped="Search"/>
          </Image.GestureRecognizers>  
        </Image>

//And for the Search create in your ViewModel

 private void Search(object sender, EventArgs e)
 {
      //Your code here
 }
另一答案

我曾经采用将选定项目绑定到视图模型的方法,但这往往会导致过滤掉程序化更改与用户操作之间的麻烦。我个人最喜欢的是附属物。

public static readonly BindableProperty ListItemTappedCommandProperty = BindableProperty.CreateAttached<AttachedProperties, ICommand>(
    staticgetter: o => (ICommand) o.GetValue(ListItemTappedCommandProperty), 
    defaultValue: default(ICommand),
    propertyChanged: (o, old, @new) =>
    {
        var lv = o as ListView;
        if (lv == null) return;

        lv.ItemTapped -= ListView_ItemTapped;
        lv.ItemTapped += ListView_ItemTapped;
    });

private static void ListView_ItemTapped(object sender, object item)
{
    var lv = sender as ListView;

    var command = (ICommand) lv?.GetValue(ListItemTappedCommandProperty);
    if (command == null) return;

    if (command.CanExecute(item))
        command.Execute(item);
}

...然后在ListView上设置:

controls:AttachedProperties.ListItemTappedCommand="{Binding ItemSelectedCommand}"

甚至可以将其扩展为采用事件名称并更普遍地应用,但这是另一次的练习。

另一答案

为什么不将listview的selectedItem属性绑定到viewModel属性(比如说'selectedItem'属性);然后在viewModel中'selectedItem'属性的setter上执行命令。

以上是关于Xamarin表单ListView ItemTapped / ItemSelected在XAML上绑定命令的主要内容,如果未能解决你的问题,请参考以下文章

ListView 披露指示器按钮 - Xamarin 表单

WillEnterForeground 上的 Xamarin 表单更新 ListView

Xamarin 表单中的可扩展 ListView

如何知道 ListView 中修改了哪个 Xamarin 表单条目?

ListView 内的 Xamarin 表单按钮命令绑定

更新 ObservableCollection 无法正确更新 Xamarin 表单中的 ListView