3

我经历了许多相同类型的问题,但找不到合适的解决方案。我为我的MainViewModel.cs类实现了INotifyPropertyChanged,以查看我的源更改时是否更新了UI,但在运行我的应用程序时没有影响。如何在SQL Server上更新ItemsSource时自动刷新数据网格项目

这是我的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; 
} 
} 
} 

回答

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 ... 
} 
+0

感谢您的答复,是不是可以张贴一些例子吗? –

+0

我已经添加了一个如何设置计时器的示例(更改间隔以适合任何情况)。 – Belogix

+0

我应该在循环之前放置计时器吗? –

相关问题