2016-10-20 36 views
0

我正在製作一個XAML應用程序,我遇到了一些問題,它將我的xaml文件與其類綁定。Xaml - 無法獲取類文件中的項目名稱(在listView中)

<?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> 

在我的CS文件testXaml.cs多數民衆贊成鏈接到此XAML:

test1.FontSize = 20 ; 

//作品 - 它檢測到該標籤的test1的變量。

在我的列表視圖但是,當我試圖訪問標籤名爲test2的,它不檢測它在我的CS文件

test2.FontSize = 24 ; 

//類沒有檢測測試2(名稱test2的不存在在當前的情況下)

任何想法如何解決這個問題或爲我的cs文件中的列表項設置一個值?

回答

2

DataTemplate將在ListView中實例化爲每個項目。這意味着有一個test2的實例每個項在ListView中。假設你在ListView中有1,000個項目。你記得哪個test2?該框架無法猜測,也不會嘗試。

這裏你想要的是DataTemplate.Triggers。確切的細節將取決於您用來確定字體大小的確切邏輯,而您並未分享這些字體。這是一個使用觸發器的DataTemplate示例,您可以按原樣粘貼並查看它的工作方式。如果你給自己的DataTemplate一個或多個觸發器,那看起來就像這樣。在你的列表視圖項目模板中,DataTrigger.Binding將綁定到列表視圖項目的屬性,無論它們是什麼。

如果你通過在代碼隱藏中投入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和我添加綁定顯示的東西。您將需要添加本地代碼參考使用MyViewCell在XAML

    <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> 
    

    現在這裏是背後

    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 
          } 
         }  
        } 
    } 
    

    這樣的代碼,它會檢查你的單元格的內容,如果是確認一定的條件(在這種情況下名稱是3)它設置字體。這裏是截圖

    enter image description here