2017-08-14 60 views
0

我目前正在爲我的應用程序在一個新的ContentPage中工作,並且我有一些DataTemplates控件。Xamarin.Forms-x:引用第二級

我想在我的ContentPage的ViewModel中的一個DataTemplates中使用命令,但是我不確定如何執行正確的引用才能正常工作。這是我的XAML代碼:

<?xml version="1.0" encoding="UTF-8"?> 
<ContentPage 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    x:Class="MaverickMobileOnline.ImagesListingPage" 

    --MANY NAMESPACE REFERENCES-- 
    > 


    <ContentPage.Resources> 
     <ResourceDictionary> 
      <c:ItemTappedEventArgsConverter x:Key="ItemTappedConverter" /> 
      <c:ItemAppearingEventArgsConverter x:Key="ItemAppearingConverter" /> 
      <c:BooleanNegationConverter x:Key="not" /> 
     </ResourceDictionary> 
    </ContentPage.Resources> 

    <StackLayout Spacing="0"> 
     <commonViews:MainCustomNavBar MinimumHeightRequest="120" /> 


     <controls:PullToRefreshLayout 
      x:Name = "layout" 
      RefreshCommand="{Binding btn_reload_businesses_images_click}"  
      IsEnabled = "True"   
      IsRefreshing="{Binding Path=is_businesses_loading}" > 

      <ScrollView 
      x:Name = "scrollView" 
      HorizontalOptions="FillAndExpand" 
      VerticalOptions="FillAndExpand"> 

       <templates:ItemsStack 
        Padding="0" 
        Margin="0,10,0,10" 
        x:Name="itmStack" 
        BackgroundColor="White" 
        ItemsSource="{Binding Path=photos_list}"> 

       <templates:ItemsStack.ItemTemplate> 
        <DataTemplate> 

         <artina:GridOptionsView 

           Padding="10,0" 
           ColumnSpacing="10" 
           RowSpacing="10" 
           VerticalOptions="Fill" 
           HeightRequest="120" 
           ColumnCount="3" 
           RowCount="1" 
           ItemsSource="{Binding Path=.}"> 

           <artina:GridOptionsView.ItemTemplate> 
            <DataTemplate> 

             <ContentView 
              xmlns="http://xamarin.com/schemas/2014/forms" 
              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
              x:Class="MaverickMobileOnline.GalleryImageItemTemplate" 
              xmlns:ffimageloading="clr-namespace:FFImageLoading.Forms;assembly=FFImageLoading.Forms" 
              xmlns:fftransformations="clr-namespace:FFImageLoading.Transformations;assembly=FFImageLoading.Transformations"> 

              <ContentView.Content> 
               <ffimageloading:CachedImage 
                FadeAnimationEnabled="true" 
                Aspect="AspectFill" 
                VerticalOptions="FillAndExpand" 
                HorizontalOptions="FillAndExpand" 

                LoadingPlaceholder="advertising_photo_placeholder.png" 
                Source="{Binding Path=image_medium}" /> 
              </ContentView.Content> 

              <ContentView.GestureRecognizers> 
               <TapGestureRecognizer 
                -- HERE! -- 

                Command="{Binding Source={x:Reference X}, Path=BindingContext.command_name}" 
                CommandParameter="{Binding image_medium}" 
               /> 
              </ContentView.GestureRecognizers> 

             </ContentView> 

            </DataTemplate> 
           </artina:GridOptionsView.ItemTemplate> 
          </artina:GridOptionsView> 

        </DataTemplate> 
       </templates:ItemsStack.ItemTemplate> 
      </templates:ItemsStack> 

      </ScrollView> 
     </controls:PullToRefreshLayout> 

    </StackLayout> 

</ContentPage> 

請看看標記「 - HERE! - 」後面的代碼。

PS:我只是爲了提高性能而改進此佈局。

任何幫助將不勝感激。

UPDATE:

視圖模型:

public RelayCommand<string> btn_image_tap_preview 
{ 
    get 
    { 
     return new RelayCommand<string>(
      OpenImagePreview 
     ); 
    } 
} 

//* Image tap 
private async void OpenImagePreview(string url) 
{ 
    //* Some code 
} 

更新XAML:

<StackLayout x:Name="mainStack" Spacing="0"> 
     <commonViews:MainCustomNavBar MinimumHeightRequest="120" /> 
.... 
<ContentView.GestureRecognizers> 
    <TapGestureRecognizer Command="{Binding Source={x:Reference mainStack}, Path=BindingContext.btn_image_tap_preview}" 
         CommandParameter="{Binding image_medium}" /> 
</ContentView.GestureRecognizers> 

我調試,但我不能達到視圖模型的命令。

回答

0

您可以使用x:Reference並從您的內容頁面(如StackLayout)獲取任何佈局或元素的綁定上下文。由於其綁定上下文是頁面的ViewModel,因此它會在第一級本身找到您要查找的命令。你可以直接使用它。

<StackLayout x:Name="myStackLayout" Spacing="0"> 
     <commonViews:MainCustomNavBar MinimumHeightRequest="120" /> 
.... 
<ContentView.GestureRecognizers> 
    <TapGestureRecognizer Command="{Binding Source={x:Reference myStackLayout}, Path=BindingContext.command_name}" 
         CommandParameter="image_medium" /> 
</ContentView.GestureRecognizers> 

或者你可以設置綁定上下文TapGesture

<TapGestureRecognizer BindingContext="{Binding Source={x:Reference myStackLayout.BindingContext}}" Command="{Binding command_name}" 

DataTemplates似乎並不與x:Reference之前V1.4.4,您可以在論壇上發帖閱讀更多關於很好地工作 - x:Reference not working?。 在新版本中的實現可以在答案here中看到。 如果您有興趣修復的Bugzilla問題是here

+0

嗨,感謝您的回覆。我正在嘗試使用您的解決方案,但我無法完成工作。我更新了我的問題。提前致謝! –

+0

你有你的命令參數綁定。它不需要約束力。 –

+0

我刪除了綁定,但它仍然沒有工作,任何其他的想法?提前致謝。 –