UWP 列表视图在 updating/adding 一个元素添加到 MVVM 集合列表后不更新

UWP listview doesn't update after updating/adding an element to the MVVM collection list

我对列表视图 ItemSource 和 MVVM 绑定感到沮丧。我将列表视图与数据模型绑定。加载列表视图后,我向列表视图添加另一个项目,更新没有反映在列表视图中,但显示列表集合中的项目数增加了一个。如果我在构造函数的列表集合中添加添加,它会显示在列表视图中。

XAML

<Page
x:Class="App20.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App20"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

<Page.DataContext>
    <local:VictimsController></local:VictimsController>
</Page.DataContext>
<Grid Padding="10">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <Grid Grid.Row="0">
            <TextBlock Text="List of Victims/Trapped" HorizontalAlignment="Center" Style="{StaticResource HeaderTextBlockStyle}"/>
        </Grid>
        <Grid Grid.Row="1">
            <ListView x:Name="ls" ItemsSource="{Binding VictimList, Mode=TwoWay}">
                <ListView.HeaderTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock FontWeight="Bold" HorizontalAlignment="Center" Grid.Column="0"  Text="GPSLatitute" />
                            <TextBlock FontWeight="Bold" HorizontalAlignment="Center" Grid.Column="1" Text="GPSLongtitude" />
                            <TextBlock FontWeight="Bold" HorizontalAlignment="Center" Grid.Column="2" Text="Date" />
                        </Grid>
                    </DataTemplate>
                </ListView.HeaderTemplate>
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock HorizontalAlignment="Center" Grid.Column="0" Text="{Binding GPSLatitute}" />
                            <TextBlock HorizontalAlignment="Center" Grid.Column="1" Text="{Binding GPSLongtitude}" />
                            <TextBlock HorizontalAlignment="Center" Grid.Column="2" Text="{Binding Date}" />
                        </Grid>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </Grid>
    </Grid>
    <Button Content="Publish" VerticalAlignment="Top" 
            Height="76" Width="114" Click="Publish_Click" />
</Grid>

控制器

public class VictimsController : INotifyPropertyChanged
{
    List<VictimProfile> _victims = new List<VictimProfile>();
    public VictimsController()
    {
        //Victims.Add(new VictimProfile() { GPSLatitute = 123, GPSLongtitude = 2333 });
    }
    public List<VictimProfile> VictimList
    {
        get
        {
            return _victims;
        }
        set
        {
            _victims = value;
            OnPropertyChanged("VictimList");
        }
    }
    public void addVictim(VictimProfile profile)
    {
        _victims.Add(profile);
        OnPropertyChanged("VictimList");
    }
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

正在向列表视图模型或集合中添加一项

async void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
    {
        string ReceivedMessage = Encoding.UTF8.GetString(e.Message);
        //convert the message to json format
        var payLoad = JsonConvert.DeserializeObject<VictimProfile>(ReceivedMessage);
        // we need this construction because the receiving code in the library and the UI with textbox run on different threads
        await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
            txt.Text += ReceivedMessage;
            VictimsController model = this.DataContext as VictimsController;
            model.addVictim(payLoad); //add item to the list collection
            Debug.WriteLine("count: " + ls.Items.Count); //this shows that listview has one more item added to it, but nothing is shown in the listview
            //ls.Items.Add(payLoad);
        });
    }

关键是列表集合有新项目,ls(列表视图)也有项目,但它没有显示在列表视图中。

终于解决了。 将列表更改为可观察集合已解决问题。

 ObservableCollection<VictimProfile> _victims = new ObservableCollection<VictimProfile>();