展示一个复杂的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,然后为外部属性创建匿名类型,为内部可观察集合创建另一个匿名类型,最后我将其合并为一个新对象。但这有点太麻烦了。有人有更好的建议吗?

展示一个复杂的c#对象,它在WPF中具有属性和内部集合

你的数据对象一点也不复杂…它只包含一个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 LabelListBox的项目。最后一部分是声明另一个DataTemplate来定义KeyValuePair<int, double>项的外观。因此,正如您所看到的,通过分解这个问题,然后一点一点地构建这个代码,很容易完成。

相关文章: