我是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命令。
答案 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
解释非常详细。希望它有所帮助。