微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xamarin MVVM,将ListView项绑定为命令参数

如何解决Xamarin MVVM,将ListView项绑定为命令参数

我有一个从视图模型填充的ListView,现在我可以轻松地将数据模板的元素绑定到数据源项的属性,并将这些属性发送到视图模型中的命令。但是我想象一个人应该能够发送整个源项目。但是,当我发送除字符串以外的任何内容时,应用程序将崩溃或按钮均被禁用,并且似乎不会触发该命令。这个OOP和xamarin newb非常感谢任何指针/帮助。我怀疑这只是按钮中的语法,或者是我不了解的命令中的语法,目前的内容是:

<ContentPage.BindingContext>
    <local:Testviewmodel/>
</ContentPage.BindingContext>
<ContentPage.Content>
    <StackLayout  >
        <Label Text="{Binding SelectedItem.Term_id}"
            VerticalOptions="CenterandExpand" 
            HorizontalOptions="CenterandExpand" />
        <BoxView HeightRequest="1" BackgroundColor="Black" HorizontalOptions="FillAndExpand" />
        <ListView x:Name="propListView"
            SelectedItem="{Binding SelectedItem}"
            ItemsSource="{Binding SimpleProperties}"  >
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell x:Name="theItem" >
                        <StackLayout Orientation="Horizontal">
                            <Button Text="{Binding Agt_name}"
                              Command="{Binding BindingContext.doCheckin,Source={x:Reference Page}}"
                              CommandParameter="{Binding BindingContext.doCheckin,Source={x:Reference theItem},Mode=OneWayToSource}"
                                    />
                            <Label Text="{Binding Milesdistance,StringFormat='~{0:f2} mi.'},Converter={ConvertTodouble}}" HorizontalOptions="CenterandExpand" />
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage.Content>

...

using AgentApp.Models;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows.Input;
using Xamarin.Forms;

namespace AgentApp
{
    class Testviewmodel : Baseviewmodel
    {
        private ObservableCollection<Property> simpleProperties;
        public ObservableCollection<Property> SimpleProperties { set { SetProperty(ref simpleProperties,value); } get { return simpleProperties; } }

        private Property selectedItem;
        public Property SelectedItem { get { return selectedItem; } set { SetProperty(ref selectedItem,value); } }

        public ICommand setSelection { private set; get; }
        public ICommand doCheckin { private set; get; }
        public Testviewmodel()
        {
            var SimplePropertiesList = new List<Property>();
            for (int i = 1; i <= 5; i++)
            {
                Property prop = new property();
                prop.Term_id = i.ToString();
                prop.Agt_name = "Prop " + i.ToString();
                prop.Milesdistance = (double)i * 2.5;
                SimplePropertiesList.Add(prop);
            }
            SimpleProperties = new ObservableCollection<Property>(SimplePropertiesList);

            /* for buttons:*/
            doCheckin = new Command<Property>(
                execute: (Property item) =>
                {
                    Console.WriteLine("doCheckin() executes: " + item.Term_id);
                    SelectedItem = item;
                },canExecute: (Property item) =>
            {
                Console.WriteLine("doCheckin() canExecute return" + item.Term_id);
                return (SelectedItem != item); 
            }
                );
        }
    }
}

当然

class Baseviewmodel : INotifyPropertyChanged
    {
        public bool SetProperty<T>(ref T storage,T value,[CallerMemberName] string propertyName = null)
        {
            if (Object.Equals(storage,value)) return false;
            storage = value;
            OnPropertyChanged(propertyName);
            return true;
        }
        public virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(propertyName));
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }

谢谢!

解决方法

但是我想一个人应该能够发送整个源项目。但是,当我发送除字符串以外的任何内容时,应用程序将崩溃或按钮均被禁用,并且似乎不会触发该命令。

根据您的描述,您想在单击按钮时传递当前项目,对吗?如果是的话,如Jason所说,按如下所示修改Button CommandParameter:

Sub xyz()

Dim chrt As Chart
Dim rngCA As Range
Dim rngPA As Range

Set chrt = ChartObjects("Chart 1").Chart
Set rngCA = Range("C5:I16")
Set rngPA = Range("E7:H14")

    With chrt.ChartArea
        .Height = rngCA.Height
        .Width = rngCA.Width
        .Top = rngCA.Top
        .Left = rngCA.Left
    End With

    With chrt.PlotArea
        .InsideHeight = rngPA.Height
        .InsideWidth = rngPA.Width
        .InsideTop = rngPA.Top - rngCA.Top
        .InsideLeft = rngPA.Left - rngCA.Left
    End With

End Sub

顺便说一下,selecteditem需要实现INotifyPropertychanged来更新数据。

  <ListView
            x:Name="propListView"
            ItemsSource="{Binding SimpleProperties}"
            SelectedItem="{Binding selectedItem}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Orientation="Horizontal">
                            <Button
                                Command="{Binding BindingContext.doCheckin,Source={x:Reference page27}}"
                                CommandParameter="{Binding .}"
                                Text="{Binding Agt_name}" />
                            <Label HorizontalOptions="CenterAndExpand" Text="{Binding MilesDistance}" />
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

 doCheckin = new Command((e) =>
        {
            var item = (e as Property);
            Console.WriteLine("the property Term_id is {0} ",item.Term_id);
        });

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。