【问题标题】:How send data (selectItem of listView) from xaml to ViewModel如何将数据(listView 的 selectItem)从 xaml 发送到 ViewModel
【发布时间】:2023-03-19 14:28:01
【问题描述】:

我想在我的 viewModel 中选择数据

这是我的 xaml,但我不知道如何解决我的 xaml,因为这很糟糕,如何在我的 xaml 中使用我的行为?

<ListView.Behaviors>
                <behaviors:ItemTappedBehavior EventName="ItemSelected">
                    <behaviors:InvokeCommandAction Command="{Binding SelectedTagChanged}" />
                </behaviors:ItemTappedBehavior>
            </ListView.Behaviors>
<ListView  ItemsSource="{Binding actors}" ItemTapped="ListView_ItemTapped">

在我的后台代码中

public partial class ActorsView : ContentPage
    {
        public AccountsView()
        {
            InitializeComponent();
        }
    async void ListView_ItemTapped(object sender, ItemTappedEventArgs e)
            {
                Actor selectedItem = (Actor)e.Item;
                Console.WriteLine("WORK"+ Actor.Name);
            }

但我想进入我的 viewModel,不要进入我的后台代码

我已经看到解决方法是命令或行为

这是我的视图模型:

public class ActorsViewModel : ViewModelBase
    {
        public List<Actor> actors { get; set; }

        public AccountsViewModel(IActorManager actorManager)
            : base()
        {

编辑,我正在使用命令,但我不知道如何使用 John Livermore 的答案,我想使用并显示控制台 Console.WriteLine("ROW");.

public class ItemTappedBehavior : Behavior<ListView>
    {
        public ICommand Command { get; set; }

        protected override void OnAttachedTo(ListView bindable)
        {
            base.OnAttachedTo(bindable);
        }

        protected override void OnDetachingFrom(ListView bindable)
        {
            base.OnDetachingFrom(bindable);
        }

        public Command SelectedTagChanged
        {
            get
            {
                return new Command(row =>
                {
                    Console.WriteLine("ROW");
                });
            }
        }
    }

【问题讨论】:

  • 发布您的 ViewModel.cs 和您的 Page.cs 构造函数。
  • @Greggz 什么 page.cs?我编辑了我的问题
  • 您的代码在其中的 Page.cs
  • @Greggz 我编辑了我的问题,请看,我没有很多代码
  • 你是怎么绑定你的actors的,你还没有绑定你页面的BindingContextActorsViewModel

标签: xamarin.forms


【解决方案1】:

由于您要求更改 ListView 选择的更简单的行为。请使用以下内容:

以下类继承自 BehaviorBase,它负责 BindingContext 分配。

  1. OnAttachedTo 覆盖上,ItemSelected 事件被挂钩。
  2. OnDetachingFrom 覆盖上,ItemSelected 事件被取消挂钩。
  3. Command 可绑定属性绑定到ViewModel 中的命令
  4. 如果e.SelectedItem 被传递给命令。 (改变 将其设置为您希望传递的任何值)
public class SelectionChangedEventBehavior : BehaviorBase<ListView>
{
    public static readonly BindableProperty CommandProperty = BindableProperty.Create("Command", typeof(ICommand), typeof(SelectionChangedEventBehavior), null);

    public ICommand Command
    {
        get { return (ICommand)GetValue(CommandProperty); }
        set { SetValue(CommandProperty, value); }
    }

    protected override void OnAttachedTo(BindableObject bindable)
    {
        base.OnAttachedTo(bindable);

        AssociatedObject.ItemSelected += AssociatedObject_ItemSelected;
    }

    protected override void OnDetachingFrom(ListView bindable)
    {
        base.OnDetachingFrom(bindable);

        AssociatedObject.ItemSelected -= AssociatedObject_ItemSelected;
    }

    private void AssociatedObject_ItemSelected(object sender, SelectedItemChangedEventArgs e)
    {
        if (Command != null)
        {
            Command.Execute(e.SelectedItem);
        }
    }
}

用法

Xaml

<ListView ItemsSource="{Binding Collection}">
            <ListView.Behaviors>
                <local:SelectionChangedEventBehavior Command="{Binding SelectionCommand}" />
            </ListView.Behaviors>
        </ListView>

视图模型

public class ViewModel : INotifyPropertyChanged
{

    public Command<object> SelectionCommand { get; set; }
    public ViewModel()
    {
        SelectionCommand = new Command<object>(OnSelection);
    }

    private void OnSelection(object item)
    {
        var selectedActor = (item as Actor);
    }
}

希望这对您有用。如果可能,请整体使用EventToCommandBehavior,因为您可以将它重用于任何控件和任何事件。

【讨论】:

    【解决方案2】:

    在您的 XAML 中执行以下操作:

    设置您的&lt;ListView ItemsSource="{Binding actors}" ItemTapped="ListView_ItemTapped"&gt;

    成为&lt;ListView ItemsSource="{Binding actors}" SelectedItem = "{Binding SelectedActor, Mode=TwoWay}&gt;

    在当前 XAML 绑定到的视图模型中,创建两个新变量,如下所示:

    private Actor selectedActor;
    public Actor SelectedActor {
         get {return selectedActor;}
         set {
           selectedActor = value;
           if(selectedActor != null) {//set properties here if needed}
    
        OnPropertyChanged("SelectedActor"); //or however you raise your events, this is a 
        //custom method i've made
    }
    

    现在,在我们定义 actors 项目源的地方,我们还将定义 selectedActor 是什么:

    //get your actors, loop over them and add them to the list of actors
    var actorItem = new Actor();
    actors.Add(actorItem);
    
    //outside of list raise the property changed event on your actors list. 
    OnPropertyChanged("actors")
    

    这是我在工作中用来获取所选项目的模式。如果你需要对它做一些事情,你可以在 SelectedActor 变量中定义它。对我们来说,我们的应用是旧的 xamarin(.Android 和 .iOS)和 .Forms 的混合体,因此我们将操作从本机级别传递到视图模型(例如:加载所选项目的摘要页面)

    【讨论】:

    • 代码中缺少一些大括号
    猜你喜欢
    • 2013-02-24
    • 2016-10-19
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2021-06-26
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多