I came across this solution that should bind to the root page not the listview which isn't working for me (i'm trying to execute command when button pressed inside listview and pass listview item id with it) right now the (Path=BindingContext.RequestAccepted) is given Cannot resolve property "RequestAccepted" in data context of type object .
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:viewModels="clr-namespace:XamarinApp.ViewModels;assembly=XamarinApp"
x:Name="RequestsPage"
x:Class="XamarinApp.ViewModels.Views.CustomerTransferRequestsPage">
<ContentPage.BindingContext>
<viewModels:CustomerTransferRequestsViewModel/>
</ContentPage.BindingContext>
<ContentPage.Content>
<StackLayout >
<Label Text="لا يوجد لديك طلبات حالياً" IsVisible="{Binding EmptyLableVisible}" ></Label>
<ActivityIndicator IsRunning="{Binding IsLoading}" HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"/>
<ListView ItemsSource="{Binding RequestedItems}"
HasUnevenRows="True"
ItemTapped="ListView_OnItemTapped"
>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<Label Text="{Binding RequestUserName}"></Label>
<Label Text="{Binding ItemsName}"></Label>
<Label Text="{Binding ItemsPrice}"></Label>
<StackLayout Orientation="Vertical">
<Button Text="قبول" Command="{Binding Source={x:Reference RequestsPage}, Path=BindingContext.RequestAccepted}"></Button>
<Button Text="رفض"></Button>
</StackLayout>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage.Content>
The viewModel
public class CustomerTransferRequestsViewModel : INotifyPropertyChanged
{
public CustomerTransferRequestsViewModel()
{
if (GetRequestedItems.CanExecute(null))
{
GetRequestedItems.Execute(null);
}
}
ApiServices _apiServices = new ApiServices();
private ObservableCollection<GetCustomerTransferOrderRespond> _requestedItems;
private bool _emptyLableVisible;
private bool _isLoading;
public ObservableCollection<GetCustomerTransferOrderRespond> RequestedItems
{
get => _requestedItems;
set
{
if (Equals(value, _requestedItems)) return;
_requestedItems = value;
OnPropertyChanged();
}
}
public bool EmptyLableVisible
{
get => _emptyLableVisible;
set
{
if (Equals(value, _emptyLableVisible)) return;
_emptyLableVisible = value;
OnPropertyChanged();
}
}
public bool IsLoading { get => _isLoading; set
{
if (Equals(value, _isLoading)) return;
_isLoading = value;
OnPropertyChanged();
}
}
public ICommand GetRequestedItems
{
get
{
return new Command(async () =>
{
IsLoading = true;
var accesstoken = Settings.AccessToken;
RequestedItems = await _apiServices.GetCustomerTranferOrdersAsync(accesstoken);
if (RequestedItems == null)
{
EmptyLableVisible = true;
IsLoading = false;
}
else
{
EmptyLableVisible = false;
IsLoading = false;
}
});
}
}
public ICommand RequestAccepted
{
get
{
return new Command(async () =>
{
//RequestAccepted Logic
});
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}