2

私は自分の問題の解決策を見つけるために多くのフォーラムを通過しましたが、適切な解決策を見つけられませんでした。

MVVMパターンに従って(MS SQL Server 2008)にDatagridバインドされているがあります。DatasourceにバインドしItemsSourceて、インターフェイスObservableCollectionを実装しました。INotifyPropertyChanged

私のデータベースは、特定の時間制約でテーブル値を変更します。ここで、この変更をUIに反映させたいと思いますDatasource(つまり、UIItemsSourceが更新されるのを確認したいと思います)。これについて考えたときTimer、クエリが15秒ごとにループで実行されるように、概念(ポーリングなど)を実装する必要があることを理解しました。

これが私のViewModel Class、親切に私をどこに実装すべきかを案内してくれますTimer Classか?

namespace MVVM_DemoAppl.ViewModels
{
public class MainViewModel : INotifyPropertyChanged
{
 // Properties for the DispatcherTimer
  private bool disposed;
  private DispatcherTimer timer = new DispatcherTimer();
  // declaring instance of a class and Observable collection
  Model _myModel = new Model();
  private ObservableCollection<SystemStatus> _systemStatusData= new ObservableCollection<SystemStatus>();
  public ObservableCollection<SystemStatus> SystemStatusData
  {
    get { return _systemStatusData; }
    set
      {
        _systemStatusData= value;
      OnPropertyChanged("SystemStatusData");
      }
  }

public MainViewModel()
 {
   initializeload();
   timer.Tick += new EventHandler(timer_Tick);
   timer.Interval = new TimeSpan(0, 0, 15);
   timer.Start();
 }

 ~MainViewModel()
   {
       Dispose(false);
   }

  protected virtual void Dispose(bool disposing)
   {
       if (!disposed)
       {
           if (disposing)
           {
               timer.Stop();
               timer.Tick -= new EventHandler(timer_Tick);
           }
           disposed = true;
       }
   }

   private void timer_Tick(object sender, EventArgs e)
   {
       try
       {
           EventLogData.Clear();
           initializeload();
       }
       catch (Exception ex)
       {
           timer.Stop();
           Console.WriteLine(ex.Message);

       }
   }
private void initializeload()
{
   DataTable table = _myModel.getData();

 for (int i = 0; i < table.Rows.Count; ++i)
   SystemStatusData.Add(new SystemStatus
   {
Systems= table.Rows[i][0].ToString(),
Date =Convert.ToDateTime(table.Rows[i][1]),
Types = table.Rows[i][2].ToString(),
Messages = table.Rows[i][3].ToString(),
Critical = Convert.ToBoolean(table.Rows[i][1]),
    });
}

  public event PropertyChangedEventHandler PropertyChanged;

 private void OnPropertyChanged(string propertyname)
   {
     var handler = PropertyChanged;
     if (handler != null)
     handler(this, new PropertyChangedEventArgs(propertyname));
  }
 }

public class Model
 {
  string con = ConfigurationManager.AppSettings["ConnectionStrings"];
   public DataTable getData()
{
  DataTable ndt = new DataTable();
  SqlConnection sqlcon = new SqlConnection(con);
  sqlcon.Open();
  SqlDataAdapter da = new SqlDataAdapter("select top 5 System,Date,Typ,Message,Critical     from test_DB.dbo.SystemStatus",con);
  da.Fill(ndt);
  return ndt;
  }
 }
}
4

1 に答える 1

3

DispatcherTimerを使用できます。ViewModelを使い捨てにし、破棄時にタイマーを強制終了します。コンストラクターで、タイマーを構成し、ハンドラーをTickイベントにフックしてから、次のように開始します。

public MainViewModel()
{
    initializeload();
    timer.Tick += new EventHandler(timer_Tick);
    timer.Interval = new TimeSpan(0, 0, 15);
    timer.Start();
}
~MainViewModel()
{
    Dispose(false);
}
public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
    if (!disposed)
    {
        if (disposing)
        {
            timer.Stop();
            timer.Tick -= new EventHandler(timer_Tick);
        }
        disposed = true;
    }
}

private void timer_Tick(object sender, EventArgs e)
{
    try 
    {
        SystemStatusData.Clear();
        initializeload();
    } 
    catch (...) 
    {
        // Problem best to stop the timer if there is an error...
        timer.Stop();
    }
}

private bool disposed;
private DispatcherTimer timer = new DispatcherTimer();
于 2013-01-15T23:51:33.720 に答える