Xamarin Forms: вызов команды ViewModel из DataTemplate - PullRequest
0 голосов
/ 26 июня 2019

Я застрял здесь с проблемой переплета.

Я создал привязываемый макет, который находится внутри шаблона элемента управления:

<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, я просто использовал x: Name родительского представления содержимого. Но: я больше не могу ссылаться на него по имени, потому что я переместил его в словарь ресурсов внутри App.xml.

Теперь, ответ может быть тривиальным, но я просто не могу найти решение.

Любая помощь приветствуется.

С уважением

1 Ответ

1 голос
/ 26 июня 2019

Вы можете найти SettingsStack StackLayout, используя Grid шаблона данных, который оборачивает все содержимое. Поскольку 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 на вашей текущей странице.

...