XAML 列表视图中的列表视图
XAML ListView in ListView
是否可以在 ListView
中创建一个 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;
希望有人能帮助我:)
- ItemsSource 不是 ItemSource
举个例子:
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>();
}
}
public class A 类
{
public 字符串标题 { 得到;放; }
}
创建列表:
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
首先,您应该进行绑定 ItemSource={Binding Item}
或在代码 listA.ItemsSource = ...
中设置 ItemSource,因为一个会覆盖另一个。因此,我将忽略您试图在代码中设置它并进行绑定的事实(这意味着您在视图中设置了数据上下文)。
<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 更改为 WeekDays,将第二个 ItemSource 更改为 TimesOfDay。这是为了解释绑定和数据上下文的工作方式。
- 外部 ListView (ListA) 从外部项目继承其 DataContext,很可能是您的页面/用户控件。
- 在您的 ListViewItem 中,数据上下文更改为 WeekDays 集合中的单个项目。 => 此树下的每个 属性 绑定都必须在 WeekDay 对象中。
- 内部 ListView (ListB) 从 ListViewItem 继承其 DataContext。
- 在 ListViewItem 中,DataContext 更改为 TimesOfDay 集合中的单个项目。
每个 ListView 都是一个新级别的对象。因此,要使我的示例正常工作,您需要遵循 class 结构,而不是我将简化代码并仅使用属性(而您应该正确实现 INotifyPropertyChanged
以进行 UI 更新)。
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; }
}
如果您想使用页面视图模型中的 2 个属性,则必须在 ListB 中使用元素绑定。但这仅适用于内部列表视图中的项目与外部列表视图中的项目不相关的情况。
{Binding ElementName=ListA, Path=DataContext.ItemsForB}
是否可以在 ListView
中创建一个 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;
希望有人能帮助我:)
- ItemsSource 不是 ItemSource
举个例子:
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>(); } }
public class A 类 { public 字符串标题 { 得到;放; } }
创建列表:
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
首先,您应该进行绑定 ItemSource={Binding Item}
或在代码 listA.ItemsSource = ...
中设置 ItemSource,因为一个会覆盖另一个。因此,我将忽略您试图在代码中设置它并进行绑定的事实(这意味着您在视图中设置了数据上下文)。
<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 更改为 WeekDays,将第二个 ItemSource 更改为 TimesOfDay。这是为了解释绑定和数据上下文的工作方式。
- 外部 ListView (ListA) 从外部项目继承其 DataContext,很可能是您的页面/用户控件。
- 在您的 ListViewItem 中,数据上下文更改为 WeekDays 集合中的单个项目。 => 此树下的每个 属性 绑定都必须在 WeekDay 对象中。
- 内部 ListView (ListB) 从 ListViewItem 继承其 DataContext。
- 在 ListViewItem 中,DataContext 更改为 TimesOfDay 集合中的单个项目。
每个 ListView 都是一个新级别的对象。因此,要使我的示例正常工作,您需要遵循 class 结构,而不是我将简化代码并仅使用属性(而您应该正确实现 INotifyPropertyChanged
以进行 UI 更新)。
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; }
}
如果您想使用页面视图模型中的 2 个属性,则必须在 ListB 中使用元素绑定。但这仅适用于内部列表视图中的项目与外部列表视图中的项目不相关的情况。
{Binding ElementName=ListA, Path=DataContext.ItemsForB}