2016-06-09 93 views
5

现在我试图让一个ListView有一些可绑定的CustomCells。我将XAML中的单元定义为ListView.ItemTemplate下的DataTemplate下的ViewCell。Xamarin表单列表视图绑定

让我们简单地说,我有两个字符串,我代表在单元格中。 ViewCell看起来像这样:

<?xml version="1.0" encoding="UTF-8"?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="simpletest.MyPage2"> 
    <ContentPage.Content> 
     <StackLayout Spacing="10" x:Name="layout" Padding="8,10"> 
      <Label Text="{Binding Something}" /> 
      <ListView x:Name="listView"> 
       <ListView.ItemTemplate> 
        <DataTemplate> 
         <ViewCell> 
          <StackLayout Orientation="Horizontal"> 
           <Label Text="{Binding Name}" /> 
           <Label Text="{Binding Price}" /> 
          </StackLayout> 
         </ViewCell> 
        </DataTemplate> 
       </ListView.ItemTemplate> 
      </ListView> 
     </StackLayout> 
    </ContentPage.Content> 
</ContentPage> 

我真的很希望保留在XAML中。我不喜欢用C#编写整个事情来把它变成一个膨胀的世界。

我有这个页面的ViewModel,我在代码背后的文件中设置绑定上下文。我的问题如下,我是否定义了一个在C#中扩展ViewCell以绑定数据的类?如前所述,我不想在C#中定义布局。我想以这种方式进行绑定。我想避免引用这些字段,因为代码背后的文件倾向于引用组件。这可能吗?我检查了Xamarin网站,该示例使用了混合代码和XAML(如果我正确解释它)。

编辑1:

我试着写,模仿一些例子文件,但这是远远不够的。没有一段代码可以解释这个文件是代表XAML中ViewCell的文件,并且没有明显的方式让我填充列表而不访问代码隐藏中的列表字段。如果我只是想使用绑定将一些项目添加到此列表中,我错过了什么?

public class ReportedAssignmentCell : ViewCell 
{ 
    public ReportedAssignmentCell() 
    { 
    } 

    public static readonly BindableProperty NameProperty = BindableProperty.Create("Name", typeof(string), typeof(ReportedAssignmentCell), ""); 
    public static readonly BindableProperty PriceProperty = BindableProperty.Create("Price", typeof(string), typeof(ReportedAssignmentCell), ""); 



    public string Name 
    { 
     get { return (string)GetValue(NameProperty); } 
     set { SetValue(NameProperty, value); } 
    } 
    public string Price 
    { 
     get { return (string)GetValue(PriceProperty); } 
     set { SetValue(NameProperty, value); } 
    } 
} 
+0

你写的代码应该工作正常。如果你想扩展或定制一个'ViewCell',那么你可以用C#代码扩展它,并在你的XAML中引用它,但是你并不需要并且可以完全按照你以前所做的来做。你有特定的问题吗? – hvaughan3

+0

我想我在这里误解了一些根本性的东西。我不知道如何引用该文件,你建议这应该在标签中完成?我也不了解我如何填充列表。我更新了我的问题,使其更加明显。 –

+0

看到我的答案,并让我知道如果你仍然有问题 – hvaughan3

回答

5

您需要将ListView小号ItemSource属性设置为项目的列表。该项目列表应包含在您的视图中。事情是这样的:

<ListView ItemSource="{Binding ListOfItems}" ...> 
... 
</ListView> 

然后在您的视图模型:

private ObservableCollection<ItemModel> _listOfItems; 
public ObservableCollection <ItemModel> ListOfItems { 
    get { return _listOfItems ?? _listOfItems == new ObservableCollection<ItemModel>; } 
    set { 
     if(_listOfItems != value) { 
      _listOfItems = value; 
      SetPropertyChanged(); 
     } 
    } 

现在,如果你想使用自定义的ReportedAssignmentCell你可以,但你也可以只留下StackLayoutLabels在那里。尝试设置ItemSource,就像我上面所描述的那样,使用您发布的当前ListView XAML并查看是否会给您提供您正在寻找的效果。如果没有,请告诉我。

A ViewCell是为了容纳其他物品,如StackLayout s和Labels。它但不必包含那些Label将要绑定的所有属性。绑定从ListView.ItemSource传递到您的ListView.ItemTemplate。该绑定不需要ViewCell具有绑定工作的任何特殊属性。我希望这是有道理的。如果不让我知道什么不对。

+0

谢谢,你真的救了我。 –

+0

@why_vincent绝对乐意帮忙 – hvaughan3