【发布时间】: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