2015-10-22 41 views
1

是否有可能在ListView中制作ListView,如果是,是甚至可以在两者中绑定数据?我已经尝试过,但它不会工作第一个列表显示为我想但第二个不显示。ListView中的XAML ListView

代码看起来有点像这样:

<ListView ItemSource="{Binding Item}" x:Name="ListA"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <TextBlock Text="{Binding Day}"/> 
       <ListView x:Name="ListB" ItemSoruce="{Binding Item}"> 
        <ListView.ItemTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Time}"/> 
         </DataTemplate> 
        </ListView.ItemTemplate> 
       </ListView> 
      </Grid> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

C#

listA.ItemsSource = timebooking.TimeBookingDataPeriod.TimeBookingData; 

希望sombody可以帮我:)

+0

现在它应该更容易理解 – blueeyes

回答

1

首先,您应该去一个结合ItemSource={Binding Item}或作为一个在代码listA.ItemsSource = ...设置的ItemSource覆盖等。所以我会忽略这样一个事实,即你试图在代码中设置它并使用绑定(这意味着你的视图上有一个datacontext)。

<ListView ItemSource="{Binding WeekDays}" x:Name="ListA"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <TextBlock Text="{Binding Day}"/> 
       <ListView x:Name="ListB" ItemSource="{Binding TimesOfDay}"> 
        <ListView.ItemTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Time}"/> 
         </DataTemplate> 
        </ListView.ItemTemplate> 
       </ListView> 
      </Grid> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

我已经改变了你的第一个的ItemSource平日和第二的ItemSource到TimesOfDay的清晰度。这解释了绑定和数据上下文如何工作的方式。

  • 外部ListView(ListA)从外部项继承它的DataContext,很可能是您的页面/用户控件。
  • 在您的ListViewItem中,datacontext被更改为WeekDays集合中的单个项目。 =>此树下绑定的每个属性必须位于WeekDay对象中。
  • 内部ListView(ListB)从ListViewItem继承它的DataContext。
  • 在ListViewItem中,DataContext更改为TimesOfDay集合中的单个项目。

每个ListView都是一个新的对象级别。因此,为了使我的示例能够正常工作,您需要遵循类结构,而不是简化代码并仅使用属性(而您应该正确实现用于UI更新的INotifyPropertyChanged)。

public class SampleViewModel : INotifyPropertyChanged 
{ 
    public ObservableCollection<WeekDay> WeekDays { get; set; } // first listview 
} 

public class WeekDay 
{ 
    public string Day { get; set; } 
    public ObservableCollection<TimeOfDay> TimesOfDay { get; set; } // second listview 
} 

public class TimeOfDay 
{ 
    public string Time { get; set; } 
} 

如果你想使用页面的viewmodel中的2个属性,你必须在ListB中使用一个元素绑定。但是,这只适用于内部列表视图中的项目与外部列表视图中的项目不相关的情况。

{Binding ElementName=ListA, Path=DataContext.ItemsForB} 
+0

我很抱歉Sergiu Cojocaru,但你的答案是更多我想要的,并为我的错误感到遗憾^^ – blueeyes

0
  1. 的ItemsSource没有的ItemSource
  2. 这里是一个例子:

    public class ClassB 
        { 
         public string Name { get; set; } 
         public ObservableCollection<ClassA>classAList { get; set; } 
    
         /// <summary> 
         /// Initializes a new instance of the <see cref="ClassB"/> class. 
         /// </summary> 
         public ClassB() 
         { 
          Name = String.Empty; 
          classAList = new ObservableCollection<ClassA>(); 
    
         } 
        } 
    

    公共类ClassA的 { 公共字符串名字{获得;组; } }

创建列表:

ObservableCollection<ClassB> list = new ObservableCollection<ClassB>(); 

初始化列表:

ClassB item1 = new ClassB() { Name = "listAItem1" }; 
      item1.classAList.Add(new ClassA { Caption = "listBItem1" }); 
      item1.classAList.Add(new ClassA { Caption = "listBItem2" }); 
      item1.classAList.Add(new ClassA { Caption = "listBItem3" }); 
      item1.classAList.Add(new ClassA { Caption = "listBItem4" }); 
      item1.classAList.Add(new ClassA { Caption = "listBItem5" }); 

      list.Add(item1); 


      ClassB item2 = new ClassB() { Name = "listAItem1" }; 
      item2.classAList.Add(new ClassA { Caption = "listBItem1" }); 
      item2.classAList.Add(new ClassA { Caption = "listBItem2" }); 
      item2.classAList.Add(new ClassA { Caption = "listBItem3" }); 
      item2.classAList.Add(new ClassA { Caption = "listBItem4" }); 
      item2.classAList.Add(new ClassA { Caption = "listBItem5" }); 

      list.Add(item1); 

      this.DataContext = list; 

和XAML:

<ListView ItemsSource="{Binding}" x:Name="ListA"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <TextBlock Text="Day"/> 
         <ListView x:Name="ListB" ItemsSource="{Binding classAList}"> 
          <ListView.ItemTemplate> 
           <DataTemplate> 
            <TextBlock Text="{Binding Caption}"/> 
           </DataTemplate> 
          </ListView.ItemTemplate> 
         </ListView> 
        </Grid> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
  • 它似乎你想创建一个分组的列表,在这种情况下,最好使用GridView控件与组: 所有的Good step by step tutorial for grouped gridview