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

如何在xamarin表单的XAML中绑定类属性

如何在一个 Xamarin 表单标签中有 2 个数据绑定字段?

如何在一个Xamarin表单标签中有2个数据绑定字段?

如何在 Xamarin 表单跨平台中添加服务引用?