我要制作可分页列表视图。
我几乎实现了除了索引显示之外的所有功能。
我将 listviewitem 作为多重绑定传递给转换器以显示索引。
但是listview显示索引直到第2页,但在第3页上它会生成异常,因为传递的listviewitem是断开连接的项目。
当我使用单一绑定(没有startpos)时,效果很好。它仅在多重绑定时生成。
错误屏幕截图:values[1] 已断开连接editem:
这是usercontrol.xaml.cs文件部分:
public static readonly DependencyProperty DisplayListProperty
= DependencyProperty.Register("DisplayList", typeof(List<Retweet>), typeof(PagingGrid));
public List<Retweet>? DisplayList
{
get => (List<Retweet>)this.GetValue(DisplayListProperty);
set
{
SetValue(DisplayListProperty, value);
}
}
这是 usercontrol.xaml:
<ListView Name="list" Grid.Row="1" VerticalContentAlignment="Center" HorizontalContentAlignment="Stretch" ItemsSource="{Binding DisplayList}" Background="{StaticResource bBack}">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<Grid>
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<Grid VerticalAlignment="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50" />
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<Grid.Resources>
<Style TargetType="TextBlock">
<Setter Property="Margin" Value="5,0" />
<Setter Property="Foreground" Value="White" />
</Style>
<Style TargetType="Border">
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Background" Value="{StaticResource bBack}"/>
<Setter Property="BorderBrush" Value="{StaticResource bBorder}"/>
</Style>
</Grid.Resources>
<Border Grid.Column="0" >
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource converter}">
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type ListViewItem}}"/>
<Binding Path="StartPos" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}"/>
<!--<Binding Path="DisplayList" RelativeSource="{RelativeSource AncestorType={x:Type UserControl}}"/>-->
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Border>
这是转换器:
public class IndexConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
ListViewItem item = (ListViewItem)values[0];
ListView listView = (ListView)ItemsControl.ItemsControlFromItemContainer(item);
int startPos = (int)values[1];
int index = listView.ItemContainerGenerator.IndexFromContainer(item) + 1 + startPos;
return index.ToString();
//return (((List<Retweet>)values[2]).FindIndex(a => a.RetweetId == ((Retweet)values[0]).RetweetId) + (int)values[1]).ToString();
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
当前用户控件设计:
你得到答案了吗?我也有同样的问题