0

我在这里遇到了一个绑定问题。

我在控件模板中创建了一个可绑定布局:

<ContentView x:Name="SettingsMenu" ControlTemplate="{StaticResource HeaderTemplate}" AbsoluteLayout.LayoutBounds="0.5,0.5,1,1" 
AbsoluteLayout.LayoutFlags="All">               
    <ScrollView Orientation="Vertical" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">                   
        <StackLayout x:Name="SettingsStack" BindableLayout.ItemsSource="{Binding Settings}" BindableLayout.ItemTemplateSelector="{StaticResource SettingsSelectorTemplate}" Orientation="Vertical" Spacing="0" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" />           
    </ScrollView>        
</ContentView>

我想要做的是在视图模型中调用一个命令。该调用位于项目模板选择器中,作为 App.xml 中的资源字典

<ResourceDictionary>
    <DataTemplate x:Key="PlaceholderSettingsTemplate">
        ### SOME STUFF
     </DataTemplate>
     <DataTemplate x:Key="HeaderSettingsTemplate">
             ### SOME STUFF
         <Grid ...>
             <Grid.GestureRecognizers>
                 <TapGestureRecognizer Tapped="ButtonClick" Command="{Binding BindingContext.SettingsTap, Source={x:Reference SettingsPage}}" CommandParameter="{Binding}" />  ########## <--------- WHAT TO USE FOR SOURCE?
             </Grid.GestureRecognizers>
         </Grid>
     </DataTemplate>
     <data:SettingsSelector x:Key="SettingsSelectorTemplate" Placeholder="{StaticResource PlaceholderSettingsTemplate}" Heading="{StaticResource HeaderSettingsTemplate}" Content="{StaticResource ContentSettingsTemplate}" />
</ResourceDictionary>

在将它移到 App.xml 文件的资源字典中之前,我只是使用了父 Contentview 的 x:Name。但是:我不能再按名称引用它,因为我将它移到了 App.xml 中的资源字典中。

现在,答案可能微不足道,但我找不到解决方案。

任何帮助表示赞赏。

亲切的问候

4

3 回答 3

3

您可以SettingsStack使用包含所有内容的数据模板的 Grid 找到 StackLayout。由于与SettingsStack父内容视图具有相同的绑定上下文,因此您可以访问 App.cs 中的绑定上下文,例如:

<DataTemplate x:Key="HeaderSettingsTemplate">
    <!--### SOME STUFF-->
    <Grid x:Name="ParentGrid">
        <Grid.GestureRecognizers>
            <TapGestureRecognizer Command="{Binding Parent.BindingContext.SettingsTap, Source={x:Reference ParentGrid}}" CommandParameter="{Binding}" />
        </Grid.GestureRecognizers>
    </Grid>
</DataTemplate>

ParentGrid父级SettingsStack在您的当前页面上。

于 2019-06-26T02:45:29.127 回答
2

从项目模板(即使它在不同的文件中),您可以使用以下命令访问其祖先的视图模型:

Command="{Binding Source={RelativeSource AncestorType={x:Type SettingsViewModel}}, Path=SettingsTap}" CommandParameter="{Binding}"

在这种情况下,我只是假设祖先的视图模型的名称是SettingsViewModel,但你明白了。

这是一篇关于相对绑定的有趣文章,它还描述了其他场景:https ://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/data-binding/relative-bindings#bind-到祖先

干杯。

于 2020-05-08T08:32:53.117 回答
0

另一种方式我们可以直接使用ContentPageas AncestorType。然后将命令与BindingContext.

{Binding BindingContext.SomeCommand, Source={RelativeSource AncestorType={x:Type ContentPage}}}

完整示例

<DragGestureRecognizer
    DragStartingCommand="{Binding BindingContext.SomeCommand, Source={RelativeSource AncestorType={x:Type ContentPage}}}"
    DragStartingCommandParameter="{Binding}"/>

这种方式也适用于单独的资源文件(例如MySeparateResource.xml -> MyPageView.xaml)。

于 2021-10-27T20:01:20.737 回答