Xamarin Forms:从数据模板调用ViewModel命令命令、模板、数据、Xamarin

2023-09-03 14:29:24 作者:你若安好我便安心

我在此遇到绑定问题。

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

<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>
使用Xamarin实现跨平台移动应用开发

我想做的是在视图模型中调用一个命令。该调用位于项模板选择器内部,作为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文件的资源字典中之前,我只使用了父Content view的x:name。但是:我不能再按名称引用它,因为我已将其移动到App.xml内的资源词典中。

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

感谢任何帮助。

致以亲切的问候

StackLayout

您可以使用数据模板的推荐答案找到SettingsStackStackLayout,它包装了所有内容。由于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在您的当前页面上。