I am developing a User Interface for a host monitoring application, which is already being monitored on database level. I have displayed 2 datagrids on my UI which will populate on run time.These two datagrids are connected by the HostID ( HostID is the Foreign Key in the LogDatagrid).
The First datagrid displays the list of Host with their Status(either Running or Stopped). I would like to display the Log Status of the respective HostID when a user wants to know the status in detail. How to achieve this when a user selects the Host ID in
the HostDatagrid ? I have added my XAML and screenshot of my UI. ( the datagrid data is populated from a Database-kindly have a look in the ViewModel code).May I know how do I the binding between the selected Item in the Host datagrid to the respective details
getting displayed in the Log datagrid? Kindly help
May I know how I do the binding between selected Item in grid and controls in the detail UI?
Xaml Design View :
here is the Model class for my Log table
public LogFileModel() { } private int _hostID; public int HostID { get { return _hostID; } set { _hostID= value; OnpropertyChanged("HostID"); } } private string _logid; public string LogID { get { return _logid; } set { _logid= value; OnpropertyChanged("LogID"); } } private string _logpath; public string LogPath { get { return _logPath; } set { _logPath = value; OnpropertyChanged("LogPath"); } } private DateTime _date; public DateTime Date; { get { return _date; } set { _date= value; OnpropertyChanged("Date"); } } private bool _activity; public bool LastActivity { get { return _activity; } set { _activity= value; OnpropertyChanged("LastActivity"); } }
ViewModel for my log table
LogModel _myModel = new LogModel(); private ObservableCollection<LogFileModel> _logFileData = new ObservableCollection<LogFileModel>(); public ObservableCollection<LogFileModel> LogFileData { get { return _logFileData; } set { _logFileData = value; OnPropertyChanged("LogFileData"); } } public LogFileViewModel() { initializeload(); timer.Tick += new EventHandler(timer_Tick); timer.Interval = new TimeSpan(0, 0, 3); timer.Start(); } ~LogFileViewModel() { 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 { LogFileData.Clear(); initializeload(); } catch (Exception ex) { timer.Stop(); Console.WriteLine(ex.Message); } } private void initializeload() { try { DataTable table = _myModel.getData(); for (int i = 0; i < table.Rows.Count; ++i) LogFileData.Add(new LogFileModel { HostID= Convert.ToInt32(table.Rows[i][0]), LogID = table.Rows[i][1].ToString(), LogPath = table.Rows[i][2].ToString(), Date = Convert.ToDateTime(table.Rows[i][3]), LastAcivity= table.Rows[i][4].ToString(), }); } catch (Exception e) { Console.WriteLine(e.Message); } } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyname) { var handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyname)); } public class LogModel { public DataTable getData() { DataTable ndt = new DataTable(); SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString); sqlcon.Open(); SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM [LocalDB].[dbo].[LogFiles]", sqlcon); da.Fill(ndt); da.Dispose(); sqlcon.Close(); return ndt; } } }
XAML
<DataGrid DataContext="{Binding Path=HostData,NotifyOnTargetUpdated=True,Mode=OneWay}" AutoGenerateColumns="False" Name="hostDatagrid" Margin="171,32,235,230"><DataGrid.Columns><DataGridTextColumn Header="Host" Width="auto" Binding="{Binding HostID}" /><DataGridTextColumn Header="Status" Width="auto" Binding="{Binding HostStatus}"/> </DataGrid.Columns></DataGrid><DataGrid DataContext="{Binding Path=LogData,NotifyOnTargetUpdated=True,Mode=OneWay}" AutoGenerateColumns="False" Name="LogDatagrid" Margin="103,108,102,145"><DataGrid.Columns><DataGridTextColumn Header="Host ID" Width="auto" Binding="{Binding HostID}" /><DataGridTextColumn Header="Logs" Width="auto" Binding="{Binding LogID}" /><DataGridTextColumn Header="Log Path" Width="auto" Binding="{Binding LogPath}"/><DataGridTextColumn Header="Date" Width="auto" Binding="{Binding Date}"/><DataGridTextColumn Header="Last Activity" Width="auto" Binding="{Binding LastActivity}"/></DataGrid.Columns>I have followed the same pattern for the Host Model and ViewModel too.
Kindly help me to proceed further.
Thanks indeed