2016-10-20 28 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