2016-10-20 27 views
0

私はXAMLアプリケーションを作成しています。xamlファイルをそのクラスにバインドする際にいくつか問題があります。私のCSファイルtestXaml.csでXaml - クラスファイル内の名前を取得できません(リストビュー内)

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

    <ContentPage.Content> 

<ListView x:Name="ListTest"> 

     <Label FontSize="12" x:Name="test1"/> 


     <ListView.ItemTemplate> 

       <DataTemplate> 

        <ViewCell> 

          <StackLayout Spacing="5" Orientation="Horizontal"> 

           <Label FontSize="14" x:Name="test2"/> 

          </StackLayout> 

        </ViewCell> 

       </DataTemplate> 

      </ListView.ItemTemplate> 

    </ListView> 

    </ContentPage.Content> 

</ContentPage> 

このXAMLにリンクされてthatsの:

test1.FontSize = 20 ; 

//作品 - それは、そのラベルのtest1の変数を検出します。しかし、私のリストビューで

、私はTEST2という名前のラベルにアクセスしようとすると、それは私のCSファイルでそれを検出しない

test2.FontSize = 24 ; 

//クラスは(名前TEST2が存在しないTEST2を検出しません

この問題を解決する方法や、私のcsファイルからリスト項目の値を設定する方法はありますか?

答えて

2

DataTemplateは、のListViewでインスタンス化されます。つまり、の場合はtest2のインスタンスがあり、リストビューの各アイテムがであることを意味します。 ListViewに1,000個のアイテムがあるとします。どちらがtest2を覚えていましたか?フレームワークは推測できませんし、試みません。

ここにほしいものはDataTemplate.Triggersです。正確な詳細は、共有していないフォントサイズを決定するために使用している正確なロジックに依存します。これはの例DataTemplateで、トリガーを使用し、そのまま貼り付けて動作させることができます。 1つまたは複数のトリガーをあなた自身のDataTemplateに与えると、このようになります。あなたのリストビューアイテムテンプレートでは、DataTrigger.Bindingはリストビューアイテムのプロパティにバインドされます。

codebehindにListViewItemを追加してリストビューを作成している場合は、本当に必要のない多くの問題を抱えています。

<ContentControl Content="Test"> 
    <ContentControl.ContentTemplate> 
     <DataTemplate> 
      <Label 
       x:Name="myLabel" 
       Content="{Binding}" 
       /> 
      <DataTemplate.Triggers> 
       <DataTrigger Binding="{Binding Length}" Value="4"> 
        <Setter TargetName="myLabel" Property="Background" Value="LawnGreen" /> 
        <Setter TargetName="myLabel" Property="FontSize" Value="40" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Length}" Value="5"> 
        <Setter TargetName="myLabel" Property="Background" Value="OrangeRed" /> 
        <Setter TargetName="myLabel" Property="FontSize" Value="9" /> 
       </DataTrigger> 
      </DataTemplate.Triggers> 
     </DataTemplate> 
    </ContentControl.ContentTemplate> 
</ContentControl> 
0

itemtemplate内のコントロールに名前でアクセスすることはできません。

あなたは、2つのオプション

  1. フォントサイズのためにバインドさのアイテムでプロパティを使用し、コントロールのフォントサイズにバインドを持っています。私はこれがよりクリーンなソリューションだと思う。 @ed

によって記述しかし、あなたは、ここでより多くのプログラム的な意思決定が必要な場合は、私はdefinetely MVVM

0

となるだろうと

使用してトリガ

  • は別のオプションです。 ViewCellからMyViewCellを派生させ、あなたのxmlはMyViewCellを除いて同じに見え、何かを表示するためにバインディングを追加しました。あなたは今ここにそう

    namespace ButtonRendererDemo 
    { 
        public partial class ListCellAccessPage : ContentPage 
        { 
         MyListItem[] listItems = new MyListItem[] 
         { 
          new MyListItem { Name= "1" }, 
          new MyListItem{Name= "2" }, 
          new MyListItem{Name= "3" }, 
          new MyListItem{Name= "4" } 
         }; 
    
         public ListCellAccessPage() 
         { 
          InitializeComponent(); 
    
          test1.Text = "List"; 
          ListTest.ItemsSource = listItems; 
         } 
    
        } 
    
        class MyListItem 
        { 
         public string Name { get; set; } 
        } 
    
        class MyViewCell : ViewCell 
        { 
    
         protected override void OnChildAdded(Element child) 
         { 
          base.OnChildAdded(child); 
          var label = child.FindByName<Label>("test2"); 
          if (label != null) 
          { 
           label.PropertyChanged -= Label_PropertyChanged1;//unsubscribe in case of cell reuse 
           label.PropertyChanged += Label_PropertyChanged1; 
          } 
    
         private void Label_PropertyChanged1(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
         { 
          var label = sender as Label; 
          if ((label != null) && (e.PropertyName == "Text")) 
          { 
           if (label.Text == "3") 
            label.FontSize = 48; 
           else 
            label.FontSize = 14;//in case of cell reuse 
          } 
         }  
        } 
    } 
    

    の背後にあるコードがあり、それは(あなたのセルの内容を調べ、それがある場合には一定の条件を確認し

    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
          xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
          xmlns:local="clr-namespace:ButtonRendererDemo;assembly=ButtonRendererDemo" 
          x:Class="ButtonRendererDemo.ListCellAccessPage"> 
        <ContentPage.Content> 
        <ListView x:Name="ListTest" HasUnevenRows="true"> 
         <Label FontSize="12" x:Name="test1"/> 
         <ListView.ItemTemplate> 
         <DataTemplate> 
          <local:MyViewCell> 
          <StackLayout Spacing="5" Orientation="Horizontal"> 
           <Label FontSize="14" x:Name="test2" Text="{Binding Name}"/> 
          </StackLayout> 
          </local:MyViewCell> 
         </DataTemplate> 
         </ListView.ItemTemplate> 
        </ListView> 
        </ContentPage.Content> 
    </ContentPage> 
    

    XAMLでMyViewCellを使用するようにローカルコードの参照を追加する必要がありますこの場合、nameは3)フォントを設定します。ここにスクリーンショットです

    enter image description here

  • 関連する問題