Форма Xamarin: как сделать ссылку на родительскую привязку
<ViewCell>
<ViewCell.View>
<Label Text="{Binding ABC}"></Label>
</ViewCell.View>
</ViewCell>
Предполагая, что эта видовая ячейка была внутри ListView. Если страница содержимого была связана с моделью представления, как я могу получить ссылку на привязку страницы содержимого. В настоящее время 'ABC' ссылается на свойство объекта в списке, но я хочу получить значение из привязки контекста страницы содержимого.
<ffimageloading:CachedImage.GestureRecognizers>
<TapGestureRecognizer BindingContext="{x:Reference page}" Command="{Binding OnSignInCommand}" CommandParameter="{Binding Model}" />
</ffimageloading:CachedImage.GestureRecognizers>
2 ответа
Даже qubuss дает правильный ответ Мне нравится отвечать на этот вопрос с примером, чтобы сделать его более ясным
давайте рассмотрим, у нас есть страница
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Name="firstPage" -->this reference parent context
x:Class="Your_Class_Name">
<ListView x:Name="ListSource"
ItemsSource="{Binding ListSource}" >
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid>
// this come from item source
<Label Text="{Binding ABC}"></Label>
<Button Command="{Binding BindingContext.CommandFromParent
, Source={x:Reference firstPage} }" />
</Grid>
</ViewCell>
/DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentPage>
Ваша точка зрения Модель должна выглядеть так
public class ViewModelName
{
private List<YourDataType> _listSource = new List<YourDataType>();
public List<YourDataType> ListSource
{
get => _listSource;
set
{
_listSource = value;
RaisePropertyChanged();
}
}
public ICommand CommandFromParent => new Command(HandleYourActionHere);
}
}
Небольшое объяснение того, что происходит, когда мы пишем BindingContext.CommandFromParent
BindingContext представляет BindingContext для firstPage(x:Name="firstPage"), который является ViewModelName
Вы можете привязать к предку с помощью RelativeSource
.
Измените эту строку
<Label Text="{Binding ABC}"></Label>
к этому
<Label Text="{Binding ABC, Source={RelativeSource AncestorType={x:Type viewModel:YourViewModelName}}}"></Label>
Не забудьте добавить пространство имен xml для viewModel
поверх файла:
xmlns:viewModel="clr-namespace:YourProject.ViewModels"
Вы можете прочитать все о RelativeSource
привязки здесь:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/data-binding/relative-bindings
Вам нужно добавить BindingContext="{x:Reference viewmodel}
внутри этикетки.
<ViewCell>
<ViewCell.View>
<Label Text="{Binding ABC}" BindingContext="{x:Reference Name_Of_Parent}"></Label>
</ViewCell.View>
</ViewCell>
в Name_Of_Parent вы вводите имя компонента. Если вы используете MVVM и класс ViewModel, вы должны добавить x:Name
к вашему обязательному контексту:
<ContentPage.BindingContext>
<mvvm:MasterPageModel
x:Name="viewmodel"/>
</ContentPage.BindingContext>
Это документация, которая описывает это.
Дайте странице с контентом имя:
<ContentPage x:Name="this">
Получите доступ к контексту привязки страницы следующим образом:
<Label BindingContext="{Binding Source={x:Reference this}, Path=BindingContext}" >
DataContext.Command у меня работает.
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Name="firstPage"
x:Class="Your_Class_Name">
<ListView x:Name="ListSource" ItemsSource="{Binding ListSource}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid>
<Label Text="{Binding ABC}"></Label>
<Button Command="{Binding BindingContext.CommandFromParent, Source={x:Reference firstPage} }" />
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentPage>