Xamarin 表单:如何引用父绑定
Posted
技术标签:
【中文标题】Xamarin 表单:如何引用父绑定【英文标题】:Xamarin form: How to reference to the parent binding 【发布时间】:2018-06-27 04:06:52 【问题描述】:<ViewCell>
<ViewCell.View>
<Label Text="Binding ABC"></Label>
</ViewCell.View>
</ViewCell>
假设这个 viewcell 在 ListView 中。如果内容页面与视图模型绑定,我如何获得对内容页面绑定的引用。目前,“ABC”正在引用列表中对象的属性,但我想从内容页面的 bindingcontext 中获取值。
<ffimageloading:CachedImage.GestureRecognizers>
<TapGestureRecognizer BindingContext="x:Reference page" Command="Binding OnSignInCommand" CommandParameter="Binding Model" />
</ffimageloading:CachedImage.GestureRecognizers>
【问题讨论】:
Xamarin.Forms bindingContext Set the source back to root/parent的可能重复 【参考方案1】:@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代表firstPage(x:Name="firstPage")
的BindingContext,它的类型是ViewModelName
【讨论】:
赞成显示 CommandFromParent 是 ViewModel 上的一个属性,而不是一些花哨的 XAML 语法【参考方案2】:您可以使用RelativeSource
绑定到祖先。
改变这一行
<Label Text="Binding ABC"></Label>
到这里
<Label Text="Binding ABC, Source=RelativeSource AncestorType=x:Type viewModel:YourViewModelName"></Label>
不要忘记在文件顶部添加 viewModel
的 xml 命名空间:
xmlns:viewModel="clr-namespace:YourProject.ViewModels"
您可以在此处阅读有关 RelativeSource
绑定的所有信息:
https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/data-binding/relative-bindings#bind-to-an-ancestor
【讨论】:
谢谢,我终于找到了我要找的东西!【参考方案3】:您需要在标签内添加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>
这是描述它的documentation。
【讨论】:
我的 OnSignInCommand 没有被调用。 OnSignInCommand 在页面绑定上下文的视图模型中实现。其中,CommandParameters 中的 Model 是项目的绑定对象。 请把所有的xaml,也许你需要添加对不同父级的引用。【参考方案4】: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>
【讨论】:
在 Xamarin 中,您需要使用BindingContext
而不是 DataContext
【参考方案5】:
为内容页面命名:
<ContentPage x:Name="this">
像这样访问页面的绑定上下文:
<Label BindingContext="Binding Source=x:Reference this, Path=BindingContext" >
【讨论】:
以上是关于Xamarin 表单:如何引用父绑定的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Xamarin 表单中将数组绑定到 ListView
Xamarin 表单从 listview 绑定到 viewmodel