当 Sqlite Db 发生变化时,Listview 项目不更新

Listview item is not updating when there is changes in Sqlite Db

如果数据库中有一些变化,我正在尝试刷新 Listview 项目。 但我发现的唯一工作方法是将项目添加到我的列表,然后删除它们并使用计时器再次添加。

Contacts.Clear();
DbModule.LoadLine().ForEach(es => Contacts.Add(es));//Add new items to list from DB.

或使用此代码。

CollectionViewSource.GetDefaultView(Contacts).Refresh();

在列表视图中,我使用的是 。所以对于这种情况,当我使用计时器时 刷新项目并破坏我的文字动画。我认为我错误地使用了 INotifyPropertyChanged,这应该是原因。有人可以帮我弄清楚这个吗:D
.xaml代码

            <ListView ItemsSource="{Binding Contacts}"
                          SelectedItem="{Binding SelectedContact}"                                                
                    ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                      Background="#FF2F3136"
                      BorderThickness="0"
                      Grid.Row="0"
                ItemContainerStyle="{StaticResource ContactCard}">
                <ListView.Resources>
                    <Style TargetType="Label">
                        <EventSetter Event="MouseRightButtonUp" Handler="OnMouseRightButtonUp"/>
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </ListView.Resources>
                <ListView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <!--<StackPanel Orientation="Horizontal" />-->
                        <WrapPanel />
                    </ItemsPanelTemplate>
                </ListView.ItemsPanel>
            </ListView>

主视图模型:

    class MainViewModel : ObservableObject
    {
        public ObservableCollection<ContactModel> Contacts { get; set; }
        public MainViewModel()
        {
            Contacts = new ObservableCollection<ContactModel>();
            DbModule.LoadLine().ForEach(es => Contacts.Add(es));//Add new items to list from DB.
            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromSeconds(60);
            timer.Tick += timer_Tick;
            timer.Start();
        }

        void timer_Tick(object sender, EventArgs e)
        {
            foreach (var x in DbModule.LoadLine())
            {
                Contacts.First(d => d.Line == x.Line).Code = x.Code;
                Contacts.First(d => d.Line == x.Line).Batch = x.Batch;
            }
           OnPropertyChanged();
           CollectionViewSource.GetDefaultView(Contacts).Refresh();
        }
}
    class ObservableObject : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName] string propertyname = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyname));
        }
    }

联系模特

    public class ContactModel
    {
        public int Line { get; set; }
        public string Code { get; set; }
        public string Batch { get; set; }
        public string Message1 { get; set; }
        public string Message2 { get; set; }
        public int Stacks { get; set; }
        public int StacksActual { get; set; }
        public int Units { get; set; }
        public int UnitsActual { get; set; }
    }

INotifyPropertyChanged 添加到我的 ContactModel 解决了我的问题。非常感谢 @emoacht

如果有人需要,我的 ContactModel 中的示例代码。

     class ContactModel : ObservableObject
    {
        private string _Code;
        public string Code
        {
            get { return _Code; }
            set
            {
                _Code = value;
                OnPropertyChanged();
            }
        }
    }