none
关于wpfMVVM子窗体给父窗体传值问题 RRS feed

  • 问题

  • 父窗体有DataGrid控件,DataGrid里面有很多行数据。另外还有一个定时器用来对父窗体Datagrid的数据源进行更新(从后台数据库读取)。现在选中一条数据,点击跳转按钮跳转到另一个窗体(我称之为子窗体),此时把定时器暂停不刷新。现在我在子窗体中成功获取倒了父窗体传过来的值,然后我改变了子窗体的里面的值并且对数据库进行了更新(数据库更新也成功了)。在关闭子窗口时候,我对DataGrid的数据源重新从数据库读取,并且恢复定时器。现在的问题是父窗体的数据源并没有更新,被选中的那一行还在。求问:如何使父窗体的数据进行更新!我用事件监听也用过了,不可以。

    Model层我也实现了INotifyPropertyChanged接口,DataGrid数据源集合也是用ObservableCollection集合,用的是MVVM,父窗体和子窗体的ViewModel都是在一个类中。

    2015年11月12日 8:08

答案

  • 1. 你确定父窗体DataGrid绑定的是父窗体VM的AlaemModelsList与子窗体VM的是同一个?

    2. 你的两个窗体使用不同的VM还是同一个VM?

    3. 你在 AlarmModelsList.Clear()之后 加入这一行   AlarmModelsList = null; 应该可以更新DataGrid

    

    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2015年11月13日 3:13
    版主

全部回复

  • 数据绑定代码

         private ObservableCollection<AlarmModel> BindData(string Dgree)
            {
                //如果有被选择 就不刷新
                foreach (AlarmModel temp in AlarmModelslist)
                {
                    if (temp.IsChecked == true)
                    {
                        TimeClock.Enabled = false;
                        return AlarmModelslist;
                    }
                }
                List<string[]> obj = new List<string[]>();
                string sql = "SELECT 厂站ID,描述,等级,起始时间,备注 from 故障事件当日库  WHERE 备注 IS  NULL and 等级='" 
                    + Dgree + "' ";
                // string sql = "SELECT   厂站ID,描述,等级,起始时间,备注 from 故障事件当日库   ";
                int a = IO.SQLBus.GetInstance().GetObjectsUseSQL(sql, ref obj);
                ObservableCollection<AlarmModel> ls = new ObservableCollection<AlarmModel>();
                foreach (string[] item in obj)
                {
                    AlarmModel i = new AlarmModel();
                    i.Address = item[0];
                    i.Contente = item[1];
                    i.Level = item[2];
                    i.TheTime = item[3];
                    i.Remark = item[4];
                    i.GrName = "1";
                    ls.Add(i);
                }
                return ls;
            }

    2015年11月12日 8:09
  • 子窗口关闭代码

        public void confirmEvent(object obj)
            {
              //  updataEvent();
                TimeClock.Enabled = false;
                string beizhu = beizhuTest;
                string tmAddress = tempaddress;
                string tmlevel = templevel;
                string tmcontent = tempcontent;
                string tmtime = tempthetime;
                if (string.IsNullOrEmpty(beizhu))
                {
                    MessageBox.Show("请输入备注");
             //  WinRemark.Close();
               //     return;    
                }
                else
                {
                    string sql = "UPDATE dbo.故障事件当日库 SET 备注='" + beizhu + "' WHERE 厂站ID='" + tmAddress + "' AND 描述='" + tmcontent + "' AND 等级=" + tmlevel + " AND 起始时间='" + tempthetime + "'  ";
                    int a = IO.SQLBus.GetInstance().ExecutionUseSQL(sql);
                    if (a > 0)
                    {
                        AlarmModel DeleteModel = tempmodel;//获取选中的那一行数据
                        AlarmModelslist.Remove(DeleteModel);//移除选中的数据,这样数据绑定的代码可以进行。
                        AlarmModelslist.Clear();
                  this.AlarmModelslist = BindData(IniPara.ParaGlobal.AlarmDegree.ToString());//重新数据绑定
                  this.NotifyPropertyChanged("AlarmModelslist");
                  TimeClock.Enabled = true;//恢复计时器
                        WinRemark.Close();//窗口关闭             
                    }
                    else
                    {
                        MessageBox.Show("添加失败");
                        WinRemark.Close();
                    }
                }
               
            }

    2015年11月12日 8:10
  • 1. 你确定父窗体DataGrid绑定的是父窗体VM的AlaemModelsList与子窗体VM的是同一个?

    2. 你的两个窗体使用不同的VM还是同一个VM?

    3. 你在 AlarmModelsList.Clear()之后 加入这一行   AlarmModelsList = null; 应该可以更新DataGrid

    

    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2015年11月13日 3:13
    版主