被遺忘的榕樹 2023-10-25 17:10 采纳率: 100%
浏览 8
已结题

wpf实时数据库,UI不刷新


  <ListView Name="LogView" FontFamily="Tahoma" FontWeight="Bold" Grid.Row="1" ItemsSource="{Binding}" >
      <ListView.ItemContainerStyle >
          <Style TargetType="ListViewItem">
              <!--<Setter Property="Foreground" Value="{Binding Path=Severity, Converter={StaticResource Severity2Color1Converter}}"/>-->
          </Style>
      </ListView.ItemContainerStyle>
      <ListView.View>
          <GridView>
                  <GridViewColumn Header="编号" Width="60" DisplayMemberBinding="{Binding AT_ID,UpdateSourceTrigger=PropertyChanged}"/>
                  <GridViewColumn Header="日期" Width="120" DisplayMemberBinding="{Binding EvtDateTimeLoc, StringFormat='yyyy年MM月dd日',UpdateSourceTrigger=PropertyChanged}" />
                  <GridViewColumn Header="时间" Width="120" DisplayMemberBinding="{Binding EvtDateTimeLoc, StringFormat='HH:mm:ss',UpdateSourceTrigger=PropertyChanged}"/>
               
                  <GridViewColumn Header="类别" Width="60" DisplayMemberBinding="{Binding Severity,UpdateSourceTrigger=PropertyChanged}"/>
                  <GridViewColumn Header="信号" Width="220" DisplayMemberBinding="{Binding Source,UpdateSourceTrigger=PropertyChanged}"/>
                  <GridViewColumn Header="日 志 消 息" Width="550" DisplayMemberBinding="{Binding Comment,UpdateSourceTrigger=PropertyChanged}"/>
              <!--<GridViewColumn Header="应答人" Width="220" DisplayMemberBinding="{Binding AckUser}"/>
              <GridViewColumn Header="应答时间" Width="350" DisplayMemberBinding="{Binding AckTime, StringFormat='yyyy年MM月dd日 HH:mm:ss'}"/>-->
          </GridView>
      </ListView.View>
  </ListView>

后台


```c#
public logRuntime()
{
    InitializeComponent();
    InitData(DateTime.Today, DateTime.Now, "", "");
   
}

public  async void InitData(DateTime dateTime,DateTime dateTime1,string type,string command)
{
    LogView.ItemsSource = null;
    BindingOperations.EnableCollectionSynchronization(auditTrails, alarmlock);
    var data =await  Data.Controller.AuditTrail.GetAuditTrails();
    foreach (var item in data)
    {auditTrails.Add(item); }
    LogView.ItemsSource = auditTrails;
    auditTrails.CollectionChanged += AuditTrails_CollectionChanged;
}

private void AuditTrails_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    var alamitem = e.NewItems[0] as AuditTrail;
    if (CanShow(alamitem))
    {
        LogView.Dispatcher.BeginInvoke(() =>
        {
            auditTrails.Add(alamitem);
            LogView.ScrollIntoView(alamitem);
        });
    }
}



```c#
 public static async Task<IEnumerable<AuditTrail>> GetAuditTrails()
 {
     try
     {
         //using (var con = new SqliteConnection(SystemData.ConnectionConnString))
         using (var con = SystemData.GetConnection())
         {
             //先加载SQL数据,然后清空sqlite,再插入
             var audits = await con.QueryAsync<AuditTrail>("SELECT  t1.AT_ID,t1.ATStructID,t2.Class,t2.ZT as Event,BatchStat,BatchNumber,EvtDateTimeLoc,Node,UserName,UserFullname,Comment,CommentAdd,WWVariable,ValueNew,ValueOld " +
           $" FROM AuditTrail as t1 LEFT OUTER JOIN ATStructure t2 ON t1.ATStructID = t2.ATStructID  Order BY EvtDateTimeLoc DESC limit 200");
             Translate(audits);
             return audits;
         }
     }
     catch (Exception err)
     {
         SystemData.AddErrorLog(err);
         return null;
     }
 }

首次界面启动的时候,数据可以正常显示,
这个时候,(我将界面的操作日志,全部存入数据库,这个时候,我操作的任何动作都会插入数据库当中,我切换至其他页面,在返回Log日志界面,查看,数据是否刷新)数据库 增加多行数据
UI不刷新。

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-10-26 09:42
    关注

    引自强大而免费的微信小程序:皆我百晓生

    根据你提供的代码,可能是由于在InitData方法中,你使用了auditTrails.CollectionChanged事件来监听集合的变化并更新UI,但是在auditTrails集合中添加数据时,并没有触发这个事件。

    可能的原因是,你在InitData中先将LogView.ItemsSource设置为null,然后再将它设置为auditTrails,这样可能会导致CollectionChanged事件没有正确绑定。你可以尝试在设置ItemsSource之前将其设置为一个空集合,然后再将数据添加到集合中,如下所示:

    public async void InitData(DateTime dateTime, DateTime dateTime1, string type, string command)
    {
        LogView.ItemsSource = new List<AuditTrail>();
        BindingOperations.EnableCollectionSynchronization(auditTrails, alarmlock);
        var data = await Data.Controller.AuditTrail.GetAuditTrails();
        foreach (var item in data)
        {
            auditTrails.Add(item);
        }
        LogView.ItemsSource = auditTrails;
        auditTrails.CollectionChanged += AuditTrails_CollectionChanged;
    }
    

    另外,你可以在添加数据之前使用LogView.Dispatcher.BeginInvoke方法,以确保在UI线程上进行操作,这样可以避免在异步操作中引发异常。例如:

    private void AuditTrails_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        var alamitem = e.NewItems[0] as AuditTrail;
        if (CanShow(alamitem))
        {
            LogView.Dispatcher.BeginInvoke(() =>
            {
                auditTrails.Add(alamitem);
                LogView.ScrollIntoView(alamitem);
            });
        }
    }
    

    以上是我根据提供的代码进行的一些调整,希望能够帮助你解决问题。如果还有其他疑问,请随时提问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月3日
  • 已采纳回答 10月26日
  • 赞助了问题酬金15元 10月26日
  • 修改了问题 10月25日
  • 展开全部

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题