Один ViewModel за представление?

Я разрабатываю приложение UI, которое показывает 3 datagrids, каждый из них зависят друг от друга (selectedItem связывающий)

Это - то, что я сделал до сих пор:

у datagrid1 есть одна Модель и один ViewModel,

у datagrid2 есть одна Модель и один ViewModel,

у datagrid3 есть одна Модель и один ViewModel.

and all three ViewModels are mapped to the View using DataContext in each property. The reason for setting ViewModel for each model is, The datagrid has to select the items from their respective tables from the database.

Но теперь я сталкиваюсь с трудностью, когда я пытаюсь установить SelectedItem в каждом datagrid. Я приклеиваю пример кода для одного datagrid. Как это я создал ViewModel для других двух datagrid's также.

XAML







  
 

 



 





Модель c#-

 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

  LogModel _myModel = new LogModel(); 
  private ObservableCollection _logFileData = new 
  ObservableCollection();  
  public  ObservableCollection 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();
      //for this select statement only I have created separate ViewModel for the respective Model
         SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM [LocalDB].[dbo].[LogFiles]", sqlcon);
         da.Fill(ndt);
         da.Dispose();
         sqlcon.Close();
         return ndt;
     }
 } 
}

Там какой-либо другой путь состоит в том, чтобы преодолеть эту проблему и иметь один ViewModel для одного Представления с их соответствующим datagrid - избранные заявления?

1
nl ja de

1 ответы

Вы всегда свободны разделить свою точку зрения в различных подвзглядах (как контроль за работой пользователей). То же самое можно сделать с ViewModels также.

Можно создать один ViewModel, который представляет целое представление, зная три sub viewmodels...

public class MainViewModel : ViewModel
{
    private LogViewModel _SubLogViewModel = new LogViewModel();
    public LogViewModel SubLogViewModel
    {
        get
        {
            return _SubLogViewModel;
        }
        set
        {
            if (_SubLogViewModel != value)
            {
                _SubLogViewModel = value;
                OnpropertyChanged("SubLogViewModel");
            }
        }
    }

    private HostViewModel _SubHostViewModel = new HostViewModel();
    public HostViewModel SubHostViewModel
    {
        get
        {
            return _SubHostViewModel;
        }
        set
        {
            if (_SubHostViewModel != value)
            {
                _SubHostViewModel = value;
                OnpropertyChanged("SubHostViewModel");
            }
        }
    }

    private Host _SelectedHost;
    public Host SelectedHost
    {
        get
        {
            return _SelectedHost;
        }
        set
        {
            if (_SelectedHost!= value)
            {
                _SelectedHost= value;
                OnpropertyChanged("SelectedHost");
                if(this.SelectedHost != null && this.SubLogViewModel != null)
                {
                    this.SubLogViewModel.LoadLogFor(this.SelectedHost);
                }
            }
        }
    }
}

и XAML что-то как:


    
        
    

    
        ...
    

    

    

1
добавлено
да абсолютно-> неправильно печать. Я пишу без Visual Studio, так не доверяйте на печати и т.д.;)
добавлено автор fixagon, источник
Тип foo я использовал в качестве заполнителя для типа выбранного пункта в вашей сетке. Необходимо изменить это на тип одного пункта коллекции, которую вы связываете как ItemsSource сетки. RaiseRpopertyChanged - просто различное внедрение вашего ViewModel PropertyChangedEventArgs (propertyname)->, изменяются на это
добавлено автор fixagon, источник
Спасибо за ваш ответ. но почему вы осуществили одну Модель и Один ViewModel.. Shouldn' t это быть и ViewModels как LogViewModel и HostViewModel?
добавлено автор user1221765, источник
Спасибо, жаль о беспокойстве вас. У меня есть ошибка, заявляя, что "тип или пространство имен называют ' Foo' не мог быть найден" и Ошибка 2 Имя ' RaisePropertyChanged' не существует в текущем контексте. что я должен осуществить в RaisePropertyChanged?
добавлено автор user1221765, источник
У меня все еще есть wrroe для выяснения у недостающей ссылки на сборку для Фу? и под чем вы подразумеваете, "обновляют выбранный пункт какого-либо viewmodel", я отредактировал ваш ответ, добавив отрывок для RaisePropertyChanged. любезно, можно ли взглянуть?
добавлено автор user1221765, источник
Спасибо за ответ!
добавлено автор user1221765, источник
@fix_likes_coding.. эй помощник, у меня все еще есть проблема при получении этой решенной проблемы.. Мне приклеили полный код в этой сути. любезно взгляните, если у вас есть время, и можете вы говорить мне. это было бы действительно полезно. gist.github.com/userXemY/eb3dff1b7d5f5930d3b6
добавлено автор user1221765, источник
недействительный RaisePropertyChanged (натягивают propertyName) {если (PropertyChanged! = пустой указатель) PropertyChanged (это, новый PropertyChangedEventArgs (propertyName));}
добавлено автор Marius, источник