展示一个复杂的c#对象,它在WPF中具有属性和内部集合
本文关键字:WPF 它在 属性 集合 内部 对象 一个 复杂 | 更新日期: 2023-09-27 18:08:13
我有一个这样的类:
public class NQWell : ObservableObject, ICloneable
{
public string Name { get; set; }
public ObservableCollection<KeyValuePair<int, double>> ResultsObservableCollection { get; set; }
}
ObservableCollection<NQWell> wells { get; set; }
我想在WPF (ListView, Grid, something.)中显示这个对象
应该是这样的:
ColumnHeaders:
Well 260 280
数据:
A1 0.2 0.3
A2 0.1 0.4
A3 0.6 0.5
标题"Well"来自属性的名称,而"260"answers"280"实际上是可观察对象集合中的键。
问题是,我如何规范化这个对象?
我认为一个可能的解决方案是在itemscontrol中为第一个可观察集合(井)并显示每个属性,因此在textblocks中,当涉及到ObservableCollection> resultsoservablecollection时,我创建另一个itemscontrol来行走该集合并显示它,等等。
有更好的方法吗?我的想法是,我用GridView做一个ListView,然后为外部属性创建匿名类型,为内部可观察集合创建另一个匿名类型,最后我将其合并为一个新对象。但这有点太麻烦了。有人有更好的建议吗?
你的数据对象一点也不复杂…它只包含一个string
名称和一个集合,因此显示它应该没有问题。首先,为您的类定义一个DataTemplate
…显然,您需要一个集合容器和一个TextBlock
或类似的:
<DataTemplate DataType="{YourPrefix:NQWell}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock Text="{Binding Name}" />
<ListBox Grid.Row="1" ItemsSource="{Binding ResultsObservableCollection}" />
</Grid>
</DataTemplate>
由于我没有为这个DataTemplate
指定x:Key
值,因此它将隐式地应用于自定义类的所有实例。现在您已经有了这些数据类型的集合,因此您需要另一个容器控件:
<ListBox ItemsSource="{Binding wells}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Key}" />
<TextBlock Text="{Binding Value}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
现在这个集合中的每个项目都将使用我们的DataTemplate
进行渲染,包括Name Label
和ListBox
的项目。最后一部分是声明另一个DataTemplate
来定义KeyValuePair<int, double>
项的外观。因此,正如您所看到的,通过分解这个问题,然后一点一点地构建这个代码,很容易完成。