为什么 wpf itemlist 在 itemsource 更改后断开连接

问题描述 投票:0回答:1

我要制作可分页列表视图。
我几乎实现了除了索引显示之外的所有功能。
我将 listviewitem 作为多重绑定传递给转换器以显示索引。
但是listview显示索引直到第2页,但在第3页上它会生成异常,因为传递的listviewitem是断开连接的项目。

当我使用单一绑定(没有startpos)时,效果很好。它仅在多重绑定时生成。

错误屏幕截图:values[1] 已断开连接editem:

Error screenshot: values[1] is disconnecteditem

这是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();
    }
}

当前用户控件设计:

current usercontrol design

c# wpf listview data-binding user-controls
1个回答
0
投票

你得到答案了吗?我也有同样的问题

© www.soinside.com 2019 - 2024. All rights reserved.