2017-05-29 74 views
0

我有一個用戶控件,我包括在一個ListView中,並且當用戶控件基於listitem綁定初始化時,我想添加動態內容。我不知道如何做到這一點。看到「我該如何綁定這個???」......我認爲我應該以某種方式將我的PropertyBinding綁定到listitem上?Xamarin獲取ListItem上下文

這是我與我的ListView

<?xml version="1.0" encoding="UTF-8"?> 
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:EngineerApp" x:Class="EngineerApp.GigsPage" NavigationPage.HasNavigationBar="false" xmlns:controls="clr-namespace:XLabs.Forms.Controls;assembly=XLabs.Forms"> 
<ContentPage Title="Gigs" Icon="icon.png"> 
    <StackLayout Orientation="Vertical"> 
     <local:HeaderBar LeftButtonText="Back" RightButtonText="Leave" LeftButtonClickEvent="Back" RightButtonClickEvent="Back"></local:HeaderBar> 
     <local:ButtonBar LeftButtonText="Add Gig" RightButtonText="Month View" LeftButtonClickEvent="AddGig" RightButtonClickEvent="Back"></local:ButtonBar> 
     <ActivityIndicator IsRunning="{Binding IsBusy}" IsVisible="{Binding IsBusy}"></ActivityIndicator> 
     <ListView HasUnevenRows="true" SeparatorVisibility="Default" ItemsSource="{Binding gigs}" ItemSelected="Handle_ItemSelected"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <ViewCell> 
         <Frame Padding="20,20,20,20"> 
         <Frame.Content> 
          <Frame Padding="15,15,15,15" OutlineColor="Gray" BackgroundColor="White"> 
          <Frame.Content> 
           <StackLayout Padding="20,0,0,0" Orientation="Vertical" HorizontalOptions="CenterAndExpand"> 
           <Label Text="{Binding venue}" 
             HorizontalTextAlignment="Center" 
             TextColor="#69add1"/> 
           <Label Text="{Binding date}" 
             HorizontalTextAlignment="Center" 
             FontFamily="OpenSans-Light" 
             FontSize="9" 
             TextColor="#69add1"/> 
             <local:AuthorisationBar SelectedGig="{Binding .}"></local:AuthorisationBar>   
           </StackLayout> 
          </Frame.Content> 
          </Frame> 
         </Frame.Content> 
         </Frame> 
        </ViewCell> 

        <local:GigCard /> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
    </StackLayout> 
</ContentPage> 
</TabbedPage> 

原來的視圖,然後這裏的用戶控件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="EngineerApp.AuthorisationBar"> 
    <ContentView.Content> 
     <StackLayout BackgroundColor="Red" HeightRequest="50" x:Name="barcontent" Orientation="Horizontal" HorizontalOptions="FillAndExpand"> 
      <Label HorizontalOptions="FillAndExpand" VerticalOptions="Center" Text="I want to show some data here once the bindings are working"></Label> 
     </StackLayout> 
    </ContentView.Content> 
</ContentView> 

而這裏的背後供用戶控制

using System; 
using System.Collections.Generic; 
using EngineerApp.ViewModels; 
using Xamarin.Forms; 

namespace EngineerApp 
{ 
    public partial class AuthorisationBar : ContentView 
    { 
     public static readonly BindableProperty GigProperty = BindableProperty.Create("SelectedGig", typeof(GigViewModel), typeof(AuthorisationBar), new GigViewModel()); 

     public GigViewModel SelectedGig 
     { 
      get 
      { 
       return (GigViewModel)GetValue(GigProperty); 
      } 

      set 
      { 
       SetValue(GigProperty, value); 
      } 
     } 

     public AuthorisationBar() 
     { 
      InitializeComponent(); 

      BindingContext = this; 

     } 
    } 
} 

UPDATE 1中的代碼 - 更新所有的網頁,以反映最新的建議。隨着{結合}現在我得到如下所述的錯誤:

「無法分配財產‘SelectedGig’:屬性不存在,或者不分配,或價值和物業之間的失配型」

+0

你想綁定你的usercontrol與項目列表中找到的值? – apineda

+0

正確。 DataTemplate包含我的用戶控件,因此每次都應該知道它與哪個列表視圖項有關。我不知道如何訪問我的用戶控件中的列表視圖項目。 –

回答

0

部分試試這個:

<local:AuthorisationBar SelectedGig="{Binding .}"></local:AuthorisationBar> 

其中 「」將成爲清單中的「當前」項目。

注意我在我的代碼中使用了SelectedGid,因爲這是您定義自定義控件的屬性的名稱,而不是SelectedGigId

還需要從您的自定義控件的構造函數刪除此行:

BindingContext = SelectedGig; 

BindingContext將已經類型的GigViewModel

希望這有助於!

UPDATE

背後定製控件的代碼應該如下:

public partial class AuthorisationBar : ContentView 
{ 
    public AuthorisationBar() 
    { 
     InitializeComponent(); 
    } 

    public static readonly BindableProperty SelectedGigProperty = BindableProperty.Create(nameof(SelectedGig), typeof(GigViewModel), typeof(AuthorisationBar), null); 

    public GigViewModel SelectedGig 
    { 
     get 
     { 
      return (GigViewModel)GetValue(SelectedGigProperty); 
     } 
     set 
     { 
      SetValue(SelectedGigProperty, value); 
     } 
    } 
} 

以前如前所述,你不需要任何設置爲BindingContext

更新2

迴應你的題。錯誤是您的自定義控件的BindableProperty不符合命名約定的要求。

從Xamarin BindableProperty documentation

The naming convention for bindable properties is that the bindable property identifier must match the property name specified in the Create method, with "Property" appended to it.

這就是爲什麼從GigPropertySelectedGigProperty固定您的問題更新BindableProperty。

+0

感謝您的建議,但是這也不起作用。我已更正PropertyBinding以正確指示SelectedGig狀態並返回正確的類型(GigViewModel),但我得到以下錯誤: 「無法指定屬性」SelectedGig「:屬性不存在,或不可分配,或值之間的不匹配類型和財產「 –

+0

你可以更新你原來的帖子,看它是如何看待你所做的更改? – apineda

+0

好的,現在已經更新了。 –

0

我我爲當前項目做了類似的事情 - 將當前項的ID傳遞給我的ViewModel(從您發佈的代碼中看來,您似乎沒有在MVVM範例下正確地分離關注點--VM不應該初始化任何東西在你看來):

<Button Text="Reconnect" Command="{Binding Path=BindingContext.ReconnectCommand, Source={x:Reference Name=ServicesList}}" CommandParameter="{Binding}" VerticalOptions="Center"/> 

作爲參考,傳遞命令的按鈕嵌入在一個ListView.DataTe mplate,並通過列表項的ID它是

+0

不幸的是,這並沒有讓我更接近解決方案。我沒有試圖從我的主BindingContext訪問的東西,我試圖從後面的用戶控件代碼訪問列表項視圖模型。 –

+0

Ahhhh。我使用助手來做到這一點 - 「YourViewModel yvm = new YourViewModel();'然後'yvm.function()' – sakkie