3

私は同じタイプの多くの質問を経験しましたが、正しい解決策を見つけることができませんでした。ソースが変更されたときにUIが更新されるかどうかを確認するINotifyPropertyChangedために、クラスにを実装しましたが、アプリケーションを実行しても効果がありません。MainViewModel.cs

これは私のXamlコードです:

<Window.DataContext>
<ViewModel:MainViewModel/>
</Window.DataContext>
 <Grid>
   <DataGrid ItemsSource="{Binding Path=SystemStatusData,Mode=OneWay,UpdateSourceTrigger=PropertyChanged,NotifyOnTargetUpdated=True}" 
AutoGenerateColumns="False" Height="287" HorizontalAlignment="Left" Margin="12,12,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="479" >

私のMainViewModel.csクラス:

namespace MVVM_DemoAppl.ViewModels
{
public class MainViewModel : INotifyPropertyChanged
{
  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();
 }

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 * from test_DB.dbo.SystemStatus",con);
 da.Fill(ndt);
 return ndt;
 }
 }
}
4

1 に答える 1

2

SQL Serverは、クエリが最初に実行された後、結果セットを自動的に更新しません。目的を達成するための最も基本的なアプローチは、サーバーをポーリングして設定された間隔で変更を確認し、そこから画面を更新することです。

CDCを調べると、何が変わったかを特定するのに役立ちます。ただし、これは自動ではなく、毎回クエリを再実行する必要があります。

タイマーがどのように機能するかの例:

// Background timer used to refresh...
private DispatcherTimer _timer = null;

public MainViewModel()
{
    // Do initial load
    initializeload();

    // Start the timer to refresh every 100ms thereafter (change as required)
    _timer = new DispatcherTimer();
    _timer.Tick += Each_Tick;
    _timer.Interval = new TimeSpan(0, 0, 0, 0, 100);
    _timer.Start(); 
}

// Raised every time the timer goes off
private void Each_Tick(object o, EventArgs sender)
{
    // Refresh from database etc ...
    initializeload();

    // Anything else you need ...
}

private void initializeload()
{
    // Your existing code here ...
}
于 2013-01-15T14:18:20.987 に答える