Quantcast
Channel: Windows Presentation Foundation (WPF) forum
Viewing all articles
Browse latest Browse all 18858

WPF SelectedItem binding between two datagrids

$
0
0

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





Viewing all articles
Browse latest Browse all 18858

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>