Xaml 在属性更改时更新ListView

Xaml 在属性更改时更新ListView,xaml,uwp,Xaml,Uwp,我在UWP应用程序中遇到了一个奇怪的问题。 我有一个绑定到ObservableCollection的ListView。我正在更改ObservableCollection中所有项的一个属性。问题是,由于ObservaleCollection不使用类作为类型参数,而是使用接口,因此我无法理解如何在接口上实现INotifyCollectionChanged 因此,我继续更改集合中所有项的属性,而没有实现INotifyPropertyChanged。这是一种奇怪的行为。当我更改属性时,我会在导航到包含L

我在UWP应用程序中遇到了一个奇怪的问题。 我有一个绑定到ObservableCollection的ListView。我正在更改ObservableCollection中所有项的一个属性。问题是,由于ObservaleCollection不使用类作为类型参数,而是使用接口,因此我无法理解如何在接口上实现INotifyCollectionChanged

因此,我继续更改集合中所有项的属性,而没有实现INotifyPropertyChanged。这是一种奇怪的行为。当我更改属性时,我会在导航到包含ListView的页面时立即执行此操作,它仅影响当前未在视图中的ListView项目,即,如果ListView中有100个项目,并且我可以在不向下滚动的情况下看到前10个项目,则这10个项目将保持不变,但当我向下滚动时,我看到除前10个ListViewItems之外的其他项目都反映了所做的更改。此外,当我再次向上滚动到前10项时,我发现它们现在也发生了变化

总而言之,只有当前不在视图中的项目才会得到更新

以下是我更新ObservableCollection的代码:

这是我的列表视图:

<ListView ItemsSource="{x:Bind AuthorFacets, Mode=OneWay}"
        ItemTemplate="{StaticResource ListViewDataTemplate}"                         
        SelectionMode="Multiple">

            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                </Style>
            </ListView.ItemContainerStyle>

</ListView>
我的项目模板:

<DataTemplate x:Key="ListViewDataTemplate"
              x:DataType="local:ISomeInterface">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"></ColumnDefinition>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <TextBlock Text="{x:Bind read}"/>               
        <TextBlock Text="{x:Bind num}"/>             
    </Grid>
</DataTemplate>
改变

<TextBlock Text="{x:Bind read}"/>               
<TextBlock Text="{x:Bind num}"/>    

并实现INotifyPropertyChanged,它应该可以工作。默认情况下,x:Bind是一次性的,不同于传统的绑定,因为它具有性能/内存,所以视图中的项目不会更新


没有INPC?您可以尝试调用Bindings.Update,在更改属性后更新父视图,但可能会丢失滚动位置。

您必须做两件事。首先,在拥有read和num属性的类中实现INotifyPropertyChanged,并在属性值更改时实际触发PropertyChanged事件。其次,将Mode=OneWay添加到x:Bind声明中,因为默认值为OneTime或将其更改为{Binding…}。由于您使用的是一次性绑定,加上没有INPC,已经实现的listview项根本不会被更新;然而,对于那些即将实现的,它们将第一次被新数据填充。有意义吗?当我向下滚动并再次向上滚动时,为什么这会起作用?@Clemens,问题是我将observablecollection类型作为接口而不是类给出,因为有许多类实现了该接口,在这种情况下,我在哪里实现INPC?因为当你向下滚动时,这些listview项会被新数据回收;当您向上滚动时,同样的事情是,listview项会随着新数据再次被回收。这都是虚拟化造成的。但这样做是非常错误的。您需要使用单向绑定实现INPC。
<TextBlock Text="{x:Bind read}"/>               
<TextBlock Text="{x:Bind num}"/>    
<TextBlock Text="{x:Bind read, Mode=OneWay}"/>               
<TextBlock Text="{x:Bind num, Mode=OneWay}"/>