2017-02-09 2 views
0

메신저 사용 mvvm 및 viewmodel locator.Im 버튼을 명령을 사용하거나 아무 문제없이 listview itemtap 동작을 사용합니다. 그러나 내 페이지 중 하나에서 외부 itemtemplate (리소스)를 사용해야합니다.이 템플릿에서 아무런 문제가 레이블을 바인딩 할 수 있습니다.하지만 난 캔트 단추의 바인딩 명령,이 오류 "요소에서 이름을 확인할 수 없습니다"가 표시됩니다. xamarin.forms listview의 외부 itemtemplate에서 명령 바인딩?

here is the external custom cell 


<ViewCell xmlns="http://xamarin.com/schemas/2014/forms" 
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
       xmlns:core="clr-namespace:paux;assembly=paux" 
       xmlns:controls="clr-namespace:paux.Controls;assembly=paux" 
       xmlns:xlabs="clr-namespace:XLabs.Forms.Controls;assembly=XLabs.Forms" 
       xmlns:base="clr-namespace:paux.Base;assembly=paux" 
       x:Class="paux.Controls.Cells.CustomDonemCell"> <ViewCell.View> 
      <Grid 
      BackgroundColor="{StaticResource WhiteColor}" Margin="0,0,0,0"> 
      <Grid Grid.Column="1" Grid.Row="0"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 
      <Grid Grid.Row="0"> 
       <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" /> 
       <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 
       <StackLayout 
        Grid.Column="1" 
        Margin="0,16,0,0" 
        Orientation="Vertical" 
        Spacing="0" 
        VerticalOptions="Start"> -   
        <Button Command="{Binding Path=BindingContext.mybuttonClicked, Source={x:Reference Name=mylistView}}" CommandParameter="{Binding id}" Text="My Button"/> 
       <controls:MultiLineLabel Text="{Binding BolumAdi}" Lines="2"    VerticalOptions="Center" HorizontalOptions="Center"    LineBreakMode="TailTruncation" 
       Margin="0,0,0,3"/>   
       </StackLayout> 

      </Grid> 
      </Grid> 
     </Grid> </ViewCell.View> </ViewCell> 

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:behavior="clr-namespace:paux.Behavior;assembly=paux" 
        xmlns:animations="clr-namespace:paux.Animations;assembly=paux" 
        xmlns:triggers="clr-namespace:paux.Triggers;assembly=paux" 
       xmlns:effects="clr-namespace:paux.Effects;assembly=paux" 
       xmlns:templateSelectors="clr-namespace:paux.TemplateSelectors;assembly=paux"  
       xmlns:converters="clr-namespace:paux.Converters;assembly=paux" 
       x:Class="paux.Pages.PageOgrenciDonem" > 
    <ContentPage.Resources> 
    <ResourceDictionary> 
     <templateSelectors:DataTemplateSelector x:Key="ogrenciDonemTemplate" /> 
    </ResourceDictionary> 
    </ContentPage.Resources> 
    <Grid> 
    <ListView 
     x:Name="mylistView" 
     CachingStrategy="RecycleElement" 
     ItemsSource="{Binding OgrencilikList, Mode=OneWay}" 
     HasUnevenRows="True" 
     SeparatorVisibility="None" 
     ItemTemplate="{StaticResource ogrenciDonemTemplate}" > 
     <ListView.Margin> 
     <OnPlatform x:TypeArguments="Thickness" 
        Android="8" 
        WinPhone="8"/> 
     </ListView.Margin> 
    </ListView> 
    </Grid> 
</ContentPage> 

을 (그것 잘 작동)와 뷰 모델 핸들러를 정의하는 당신이 가지고있는 문제가

public static readonly BindableProperty TestCommandProperty = 
      BindableProperty.Create("TestCommand", typeof(ICommand), typeof(CustomDonemCell), null); 
    public ICommand TestCommand => new Command<detay>(testclickevent); 
    private async void testclickevent(detay item) 
    { await NavigationService.NavigateToAsync<detayviewmodel(item.id.ToString()); 
    } 
+0

신속 재현 늦은 응답 죄송 –

+0

를 해결하려고하기 쉬울 것입니다, 나는이 깨끗하고 간단한 프로젝트로 재생, 당신은 빨리 여기의 HTTPS 볼 수 있습니다 : //www.dropbox를. 감사합니다 유리, viewmodel에서 호출하고 싶지만 경로를 사용하려고 시도하지만 성공하지 못합니다. 경로를 제공 할 때 (Source = {x : 참조 이름 = mylistView}), com/s/0yssmmncbppwd3d/testapp.rar? dl = 0 – slayer35

답변

1

에 templateselector으로, 페이지입니다. PageTestViewModel에서 정의했지만 xaml에서이 명령은 목록 또는 페이지 모델에 대해 정의되지 않았습니다. ITEM에 대해 정의됩니다. 따라서 3 가지 옵션이 있습니다. OnButtonClicked와 TestCommand를 둘 다 정의 할 필요는 없습니다. 단지 옵션으로 표시합니다. 사용자가 정의한 모두 당신이이 개 장소에서 전화를받을 경우

<Button Clicked="OnButtonClicked" Command="{Binding TestCommand}" CommandParameter="{Binding id}" Text="My Button"/> 
  1. 이 OnButtonClicked를 통해 호출하기 위해 (아래 참조)

    public partial class CustomCell : ViewCell 
    { 
        public CustomCell() 
        { 
         InitializeComponent(); 
        } 
    
        void OnButtonClicked(object sender, EventArgs args) 
        { 
    
        } 
    
    } 
    
  2. 는 항목

    public class testdata 
        { 
         public string id { get; set; } 
    
         public Command TestCommand 
         { 
          get 
          { 
    
           return new Command((o) => 
           { 
            System.Diagnostics.Debug.WriteLine("Item " + o.ToString()); 
           }); 
          } 
         } 
        } 
    
  3. 에서 호출되는

    호출하고자하는 PageTestViewModel에서 호출되도록하려면 모델 경로를 지정해야합니다. 이것은 더 복잡합니다. 이전 2 가지 방법이 효과가 없을 경우 나에게 메시지를 보내십시오. 그러나 ViewCell xaml을 별도의 파일에 저장하면 페이지 이름이나 목록 이름에 액세스 할 수 없으므로 까다로울 수 있습니다. 최상위 모델에있는 셀에서 핸들러를 지정하는 것이 좋은 디자인인지 잘 모르겠습니다. 내가 제안한 2 개의 핸들러 중 하나를 사용하여 해당 핸들러에서 해고 될 이벤트를 구독하고 싶을 수도 있습니다. 이 예제 프로젝트를 제공하는 경우

+0

감사합니다. 그러나 listview가 페이지에 있고 viewcell이 리소스에 있기 때문에 오류가 발생합니다. 내가 말한 두 번째 방법을 사용합니다. 도움을 요청합니다. – slayer35

+0

세 번째 솔루션을 설명해 주시겠습니까? 나는 같은 문제가있다, 나는 ListView에 대한 데이터 템플릿의 다른 파일에있는 Button에 명령을 바인딩하고 Command는 ViewModel에 정의되어있다. – kaktusas2598

+0

@ kaktusas2598 바인딩 경로를 사용해야합니다. –

관련 문제