2016-11-10 72 views
2

我有一個基本網格如何從基類中捕獲點擊項(位於模板中)的事件?

<Grid Grid.Row="1" Grid.Column="1" x:Name="GridName"> 
      <StackLayout Orientation="Vertical"> 
       <art:GridOptionsView ItemsSource="{Binding Items}" > 
        <art:GridOptionsView.ItemTemplate> 
         <DataTemplate> 
          <uikit:DashboardItemTemplate /> 
         </DataTemplate> 
        </art:GridOptionsView.ItemTemplate> 
       </art:GridOptionsView> 
      </StackLayout> 
     </Grid> 

它採用以下DashboardItemTemplate

<?xml version="1.0" encoding="UTF-8"?> 
<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
     xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
     BackgroundColor="White"> 
    <ContentView.Content> 
     <Grid Padding="0"> 
      <StackLayout VerticalOptions="Center" HorizontalOptions="Center" Orientation="Vertical" Spacing="10"> 
       <Grid> 
        <Label Text="" Style="{StaticResource FontIcon}" HorizontalTextAlignment="Center" Opacity="1" FontSize="130" TextColor="{Binding BackgroundColor}" VerticalOptions="Center" HorizontalOptions="Center" IsVisible="{Binding Source={x:Reference Root}, Path=ShowiconColoredCircleBackground}" /> 
        <Label Text="{Binding Icon}" Style="{StaticResource FontIcon}" Opacity="1" TextColor="White" VerticalOptions="Center" HorizontalOptions="Center" /> 
       </Grid> 
       <Label Text="{Binding Name}" TextColor="{Binding Source={x:Reference Root}, Path=TextColor}" FontSize="14" HorizontalTextAlignment="Center"> 
       </Label> 
      </StackLayout> 
     </Grid> 
    </ContentView.Content> 
    <ContentView.GestureRecognizers> 
     <TapGestureRecognizer Tapped="OnWidgetTapped" /> 
    </ContentView.GestureRecognizers> 
</ContentView> 

我如何能捕捉我的基地XAML類的 「OnWidgetTapped」 事件?

+0

你在使用Grial組件嗎? –

回答

1

我這樣做通常與我的模板的自定義綁定屬性ParentBindingContext

public class MyTemplate : ContentPage 
{ 
    public static BindableProperty ParentBindingContextProperty = BindableProperty.Create(nameof(ParentBindingContext), 
     typeof(object), typeof(BasePageTemplate)); 


    public object ParentBindingContext 
    { 
     get { return GetValue(ParentBindingContextProperty); } 
     set { SetValue(ParentBindingContextProperty, value); } 
    } 
} 

然後在你的頁面(包含模板)剛剛成立的ParentBindingContext

<DataTemplate> 
    <template:MyTemplate ParentBindingContext="{Binding BindingContext, Source={x:Reference Name=MyPageName}}" /> 
</DataTemplate> 

隨着該您可以在模板中訪問您網頁的完整BindingContext。一個命令下面的示例演示模板可如何結合命令MyCommand,這是在頁面的BindingContext

Command="{Binding ParentBindingContext.MyCommand, Source={x:Reference Name=MyTemplatePageName}}" 

但是,前提是你的頁面有一個BindingContext後面(如視圖模型)。這個ViewModel然後包含整個頁面的「全局」命令。這些命令(或者只是方法)可以被模板訪問,因爲他們知道頁面的BindingContext

+0

請問您可以告訴什麼是BasePageTemplate?我通過DataTemplateSelector根據某些條件分配模板。我有一個不同的模板來顯示取決於當前的模型。 我可以在哪裏設置ParentBindingContext? –

0

你只需要實現你的OnWidgetTapped方法:

void OnWidgetTapped(object sender, System.EventArgs e) 
{ 
    // Do stuff here 
} 
+0

我實際上想在基本網格中引發OnWidgetTapped事件,而不是在模板本身內。我怎樣才能做到這一點?像事件+ =新事件,進入gridview – OrElse

0

如果您已經定義的點觸手勢的XAML代碼綁定,你並不需要添加TapGestureRecognizer,只需登錄你的方法到事件監聽方法:

您的XAML:

<ContentView.GestureRecognizers> 
    <TapGestureRecognizer Tapped="OnWidgetTapped" /> 
</ContentView.GestureRecognizers> 

在C#代碼背後:

public void OnWidgetTapped(object sender, EventArgs args) 
{ 
// do stuff here 
} 
+0

我實際上想在基本網格中提升OnWidgetTapped事件,而不是在模板本身內。我怎樣才能做到這一點?像事件+ =新事件,進入gridview – OrElse

1

我改變了從流描述到代碼的答案。這個想法是以編程方式創建ItemTemplate,並將其與列表(或網格)傳遞給它的構造函數。定義一個函數ItemTemplateTapped並從模板中調用它。

EventOnGridPage

<?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="ButtonRendererDemo.EventOnGridPage"> 

<ListView x:Name="listView" > 
</ListView>   
</ContentPage> 

EventOnGridPage代碼後面

public partial class EventOnGridPage : ContentPage 
{ 

    public EventOnGridPage() 
    { 
     InitializeComponent(); 

     listView.ItemsSource = new List<Contact> 
     { 
      new Contact { Name = "Kirti",Status = "True"}, 
      new Contact { Name = "Nilesh",Status = "False"} 
     }; 

     listView.ItemTemplate = new DataTemplate(loadTemplate); 
    } 

    private object loadTemplate() 
    { 
     return new ViewCell() { View = new EventOnGridTemplate(this) }; 
    } 

    public void ItemTemplateTapped(string name) 
    { 
     DisplayAlert("ItemTemplateTapped", name, "OK"); 
    } 
} 

EventOnGridTemplate XAML

<?xml version="1.0" encoding="utf-8" ?> 
<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="ButtonRendererDemo.EventOnGridTemplate" 
      BackgroundColor="Green"> 

    <Label Text="{Binding Name}" x:Name="myLabel"></Label> 

</ContentView> 

EventOnGridTemplate代碼後面

public partial class EventOnGridTemplate 
{ 
    EventOnGridPage parent; 

    public EventOnGridTemplate(EventOnGridPage parent) 
    { 
     this.parent = parent; 

     InitializeComponent(); 

     var tapGestureRecognizer = new TapGestureRecognizer(); 
     tapGestureRecognizer.Tapped += TapGestureRecognizer_Tapped; 
     myLabel.GestureRecognizers.Add(tapGestureRecognizer); 

    } 

    private void TapGestureRecognizer_Tapped(object sender, EventArgs e) 
    { 
     parent.ItemTemplateTapped(myLabel.Text); 

    } 
} 
+0

我必須承認我完全印象深刻,我希望我可以遵循這個背後的整個流程 – OrElse

+0

你需要一個代碼? :-) –

+0

我很想! – OrElse

0

另一種解決方案。如果按照建議實現了OnWidgetTapped,則可以使用sender.Parent.Parent ...直到找到所需的對象 - 網格或頁面。將其轉換爲例如EventOnGridPage,然後調用該對象的函數。

相關問題