Xamarin命令不适用于Observablecollection的对象

时间:2017-09-12 07:38:08

标签: xaml xamarin xamarin.forms

我是Xamarin的新手,目前正致力于解决我面临以下问题的解决方案。 我有一个A类,它是我的Model类,而B类是我的viewModel。    模型类

Class A  : INotifyPropertyChanged
{
   public string sampleprop { get; set; }
   public event PropertyChangedEventHandler PropertyChanged;
   public virtual void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged == null)
                return;
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
}

我正在创建A类对象作为B类中的可观察集合。

Class B
    {
   public Command<string> CallCommand { get; set; }
   public ObservableCollection<A>   AobjectsCollection { get; set; }

   public B()
        {
            AobjectsCollection = new ObservableCollection<A>();
            CallCommand = new Command<string>((string arg) => 
    DoMakeCall(arg));
        }
    public void DoMakeCall(string phNumber)
        {
            string s = phNumber;
        }
}

将B类指定为主视图页面的Binding上下文。

public partial class Mainview : ContentPage
 {
    InitializeComponent ();
         BindingContext = new B();
  }

在主视图(xaml)中,我正在使用ClassB的可观察集合属性创建列表视图。

     <ListView x:Name="MessagesListView" 
                 ItemsSource="{Binding AobjectsCollection }"
                 HasUnevenRows="True" >
                 <ListView.ItemTemplate>
                   <DataTemplate>
                     <ViewCell >
                         <ViewCell.View>
             <Button x:Name="btnClick" Text="ClickMe" 
                    Command="{Binding CallCommand}" 
                    CommandParameter="sampleprop"/> 
             </ViewCell.View>
                         </ViewCell>
                   </DataTemplate>
                 </ListView.ItemTemplate>
      </ListView>

现在点击主页面上的按钮(btnClick)不会调用我的viewModel命令并执行我的方法DoMakeCall(string s)。

有人可以帮我理解这段代码中的错误吗?以及如何实现这种情况?

我的Command属性属于VM类,而不属于Model类。我唯一需要知道的是如何正确设置上下文以使其工作。我不想使用relay命令。

2 个答案:

答案 0 :(得分:3)

您目前正在将每个ViewCell绑定到A模型。它没有引用B ViewModel(这是命令所在的位置。要解决这个问题,你需要告诉ViewCell Button在MessagesListView的BindingContext(在这种情况下是你的B ViewModel)上查找命令。这看起来像这样:

BindingContext="{Binding Source={x:Reference MessagesListView}, Path=BindingContext}"

在完整的背景下:

 <ListView x:Name="MessagesListView" 
           ItemsSource="{Binding AobjectsCollection }"
           HasUnevenRows="True" >
           <ListView.ItemTemplate>
               <DataTemplate>
                   <ViewCell x:Name="viewCell">
                       <ViewCell.View>
                           <Button x:Name="btnClick" Text="ClickMe"
                                 BindingContext="{Binding Source={x:Reference MessagesListView}, Path=BindingContext}" 
                                 Command="{Binding CallCommand}" 
                                 CommandParameter="{Binding Source={x:Reference viewCell}, Path=BindingContext}"/> 
                       </ViewCell.View>
                   </ViewCell>
               </DataTemplate>
           </ListView.ItemTemplate>
</ListView>

答案 1 :(得分:0)

我建议您使用ItemSelected="Handle_ItemSelected而不是使用按钮。

<ListView x:Name="MessagesListView" 
          ItemsSource="{Binding AobjectsCollection }"
          HasUnevenRows="True" 
          ItemSelected="Handle_ItemSelected">

您可以在此处参考:Tap Gesture on List View Items

解释非常详细。希望它有所帮助。