【问题标题】:Showing list inside list inside list in UWP在UWP中的列表中显示列表中的列表
【发布时间】:2019-05-19 21:42:58
【问题描述】:

我有“注册”对象的列表。 每个寄存器都有“字段”列表。 每个字段都有位列表。

对于每个寄存器,我需要显示它的名称、字段名称和字段位列表。

我尝试在 Listiew 内的 ListView 内使用 ListView 来做到这一点。它可以工作,但是当超过 20 个寄存器时,它变得非常慢并且无法使用它。

然后我尝试使用 DataGrid,但我似乎无法更改里面的值。我发现的所有其他解决方案都太复杂了。

类是:

public class FieldBit
{
    public bool _bitValue;

    public override string ToString()
    {
        return ((_bitValue) ? 1 : 0).ToString();
    }
}

public class Field
{
    public string name;
    public ObservableCollection<FieldBit> bitsList;

    public override string ToString()
    {
        return name;
    }
}

public class Register
{
    public string name;

    public ObservableCollection<Field> reg_fields = new ObservableCollection<Field>();

}

ListView 方法:

<ListView x:Name="RegistersListView" ItemsSource="{x:Bind registersList}">
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="structures:Register">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <TextBlock Text="{x:Bind name}" Grid.Row="0" />

                        <StackPanel Grid.Row="1">
                            <ListView x:Name="FieldsListView" ItemsSource="{x:Bind reg_fields}">
                                <ListView.ItemTemplate>
                                    <DataTemplate x:DataType="structures:Field">
                                        <StackPanel>
                                            <TextBlock Text="{x:Bind name}"/>
                                            <ListView x:Name="BitsListView" ItemsSource="{x:Bind bitsList}" >
                                                <DataTemplate x:DataType="structures:FieldBit">
                                                        <TextBlock Text="{x:Bind _bitValue}"/>
                                                </DataTemplate>
                                                <ListView.ItemsPanel>
                                                    <ItemsPanelTemplate>
                                                        <StackPanel Orientation="Horizontal"/>
                                                    </ItemsPanelTemplate>
                                                </ListView.ItemsPanel>
                                            </ListView>
                                        </StackPanel>
                                    </DataTemplate>
                                </ListView.ItemTemplate>
                                <ListView.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <StackPanel Orientation="Horizontal" />
                                    </ItemsPanelTemplate>
                                </ListView.ItemsPanel>
                            </ListView>
                        </StackPanel>

                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

下面是它的外观示例:

对于不会卡住我的屏幕的简单解决方案有什么想法吗? 似乎唯一的解决方案是 DataGrid 但我似乎无法正确构建它,DataGrid 中的三重列表的任何示例都将不胜感激。 谢谢。

【问题讨论】:

  • 尝试摆脱StackPanel。这是完全没有必要的,并且会禁用 UI 虚拟化。
  • TreeView 在这种情况下,控制似乎是合法的。试试看。
  • @mm8 虽然有点帮助,但可能不够快,我需要不同的设计。
  • @Muzib 不幸的是目标 windows 版本不支持 TreeView
  • 你试过WinUI TreeView

标签: c# xaml uwp uwp-xaml


【解决方案1】:

所以经过多次尝试和错误...

  • 早于 17134 的版本不支持 TreeView。即使支持,但并非所有功能都像 WPF 中那样存在。

  • DataGrid 不是内部列表的正确解决方案。

  • 最好的解决方案就是将 ListView 替换为 ListBox。 ListBox 比 ListView 性能好很多,而且几乎没有延迟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多