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

Mar*_*mes 19 c# binding mvvm xamarin

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

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

Nir*_*hta 26

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

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

<ListView ItemsSource="{Binding PermitDetails}" 
SelectedItem="{Binding objItemSelected, Mode=TwoWay}" x:Name="lst" 
RowHeight="35" HorizontalOptions="FillAndExpand" 
VerticalOptions="Fill">
Run Code Online (Sandbox Code Playgroud)

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

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

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

希望这可以帮助!

  • 我明白你在做什么。非常聪明。使用可观察的属性设置器作为命令事件处理程序。好的。这得到了我的投票。 (2认同)

Joh*_*ore 5

这是一个老问题,也许这是一个相当新的发展,但您可以使用任何控件上的行为将事件转换为 ICommand。

一个例子...

<ListView ItemsSource="{Binding Tags}"
            SelectedItem="{Binding SelectedTag}">
    <ListView.Behaviors>
        <behaviors:EventHandlerBehavior EventName="ItemSelected">
            <behaviors:InvokeCommandAction Command="{Binding SelectedTagChanged}" />
        </behaviors:EventHandlerBehavior>
    </ListView.Behaviors>
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <ContentView Padding="8">
                    <Label Text="{Binding DisplayValue}" />
                </ContentView>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
Run Code Online (Sandbox Code Playgroud)

在此示例中,ItemSelected 事件将映射到视图模型中的 SelectedTagChanged 命令,如下所示...

public Command SelectedTagChanged
{
    get
    {
        return new Command(row =>
        {
            // do something
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是这里最有希望的答案,但您的演示没有显示如何处理 ItemSelected 的参数(对象和 SelectedItemChangedEventArgs)。这种方法可以处理这些论点吗? (2认同)

Joh*_*axs 3

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

所以..

假设您有以下控件(键 1):

<Image  x:Name="imgKey1"
        Source="key1.png"
        Aspect="AspectFit" />
Run Code Online (Sandbox Code Playgroud)

您希望当点击图像时触发“viewModel”对象的命令。我的“viewModel”具有以下属性:

public ICommand AddCharCommand { protected set; get; }
Run Code Online (Sandbox Code Playgroud)

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

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

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

因此,为了绑定视图和模式,我正在执行以下操作:

  imgKey1.GestureRecognizers.Add(new TapGestureRecognizer
        {
            Command = viewModel.AddCharCommand,
            CommandParameter = "1",
        });
Run Code Online (Sandbox Code Playgroud)

我希望我能帮助你,如果有人需要什么,我可以帮助;我在这里……还有那里。杰杰

在 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
 }
Run Code Online (Sandbox Code Playgroud)