我使用的是一个ListView,其中Binding Group和 IsGroupingEnabled=“True“ 用于标题,但我没有显示任何内容。现在,当我在启动应用程序(在Windows上)后注解掉 * * 的xaml部分<ListView.GroupHeaderTemplate>或注解掉 * * 的先前注解掉的部分<ListView.GroupHeaderTemplate>时,内容会显示出来。当我使用一个普通的 List 而不是 (Top-)Group 并且没有 IsGroupingEnabled 时,它工作得很好。始终显示 * 标签 * 宽度内容 * 测试 *。当我将ListView更改为CollectionView时,我得到了相同的结果。将显示纯列表,但不显示分组列表。
为什么调用页面时,内容没有立即显示,而是在代码中注解(在xaml中)后才显示?
XAML:
<toolkit:Expander Margin="0,0,0,30">
<toolkit:Expander.Header>
<Label Text="Tops" Style="{StaticResource labelExpander}" />
</toolkit:Expander.Header>
<Border Stroke="#888"
StrokeThickness="2"
StrokeShape="RoundRectangle 10"
HorizontalOptions="Fill">
<VerticalStackLayout Margin="16">
<Label>Test</Label>
<ListView ItemsSource="{Binding TopGroups}" IsGroupingEnabled="True">
<ListView.GroupHeaderTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding Name}"
FontSize="18"
FontAttributes="Bold" />
</ViewCell>
</DataTemplate>
</ListView.GroupHeaderTemplate>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid Padding="10" >
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Label Grid.Column="0"
Text="{Binding Numbering}"/>
<Label Grid.Column="2"
Text="{Binding ToText1}"/>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</VerticalStackLayout>
</Border>
</toolkit:Expander>
MyPage.xaml.cs:
public partial class SitzungsPage
{
public MyPage(MyPageViewModel myPageViewModel)
{
BindingContext = myPageViewModel;
InitializeComponent();
}
//...
}
MyPageViewModel.cs(相关摘录,使用CommunityToolkit.Maui):
[ObservableProperty]
private List<TopGroup> _topGroups;
private void CreateTopGroups()
{
TopGroups = new List<TopGroup>();
var tops = new List<Top>();
foreach (var to in ToDtos)
{
var top = new Top();
switch (to.Status)
{
case 1:
{
_isPuplicList ??= true;
if (_isPuplicList is false)
{
TopGroups.Add(new TopGroup("Not Public", tops));
tops = new List<Top>();
_isPuplicList = true;
}
break;
}
case 2:
{
_isPuplicList ??= false;
if (_isPuplicList is true)
{
TopGroups.Add(new TopGroup("Public", tops));
tops = new List<Top>();
_isPuplicList = false;
}
break;
}
}
top.ToText1 = to.ToText1;
top.Numbering = to.Number;
tops.Add(top);
}
if (tops.Count > 0 && _isPuplicList is not null)
{
TopGroups.Add(new TopGroup((bool)_isPuplicList ? "Public" : "Not Public", tops));
}
}
顶级组:
public class TopGroup : List<Top>
{
public string Name { get; private set; }
public TopGroup(string name, IEnumerable<Top> tops) : base(tops)
{
Name = name;
}
}
顶部:
public class Top
{
public string Numbering { get; set; }
public string ToText1 { get; set; }
public List<DokumentDto> Documents { get; set; }
}
2条答案
按热度按时间9rygscc11#
现在这个问题已经被编辑,以显示
TopGroup
是如何填充的,这个问题更容易被发现。一个有效的解决方案是在列表填满之前不设置属性。在局部变量中创建列表;在填充本地列表后设置属性:
从头开始创建列表时,这可能比清除属性列表并一次添加一个属性(这可能导致多个更新事件)的性能更好。或者差异可以忽略不计,这取决于何时调用,列表中有多少项,每个项的显示复杂度。
dwbf0jvd2#
我已经能够通过在ViewModel中将ObservableProperty更改为ObservableCollection来解决这个问题:
到
和
到
问题是当TopGroups设置为new()时会触发更改事件。所以是空的。