У меня есть список людей, заполненный из базы данных, два поля (id, имя) из объекта человека привязаны к данным с помощью переключателя, теперь, когда я нажимаю на переключатель, я открываю новый UserControl и пытаюсь показать все поля выбранного объекта в UserControl подробно.
как это реализовать в mvvm?
Модель:
namespace PersonMVVM
{
class PersonModel
{
public int PersonID { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string PersonAge { get; set; }
public string PersonAddress { get; set; }
public string PersonDepartmentID { get; set; }
public string PersonGroupID { get; set; }
public string PersonContact { get; set; }
public string PersonLevelEductationID { get; set; }
public string PersonDivisionID { get; set; }
}
}
ViewModelBase
namespace PersonMVVM
{
class ViewModelBase: INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnpropertyChanged([CallerMemberName] string propName =
null)
{
PropertyChanged?.Invoke(this, new
PropertyChangedEventArgs(propName));
}
}
}
Репозиторий данных
namespace PersonMVVM
{
class DataRepository
{
public IEnumerable
GetPersonModels()
{
var persons = new List();
var Connect = ConfigurationManager.ConnectionStrings["MysqlConnection"].ConnectionString;
using (var conn = new MySqlConnection(Connect))
using (var command = new MySqlCommand())
{
conn.Open();
command.Connection = conn;
command.CommandText = @"SELECT person.id, person.name, person.surname, person.address, person.age, person.contact, department.name AS 'department', groupp.name AS 'group', eductation.lavel, division.name AS 'division' FROM person LEFT JOIN department ON department.id = person.departmentID LEFT JOIN groupp ON groupp.id = person.groupID LEFT JOIN eductation ON eductation.id = person.eductationLavelID LEFT JOIN division ON division.id = person.divisionID";
MySqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
persons.Add(new PersonModel()
{
PersonID = (int)reader["id"],
Name = (string)reader["name"],
Surname = (string)reader["surname"],
PersonAddress = (string)reader["address"],
PersonAge = (string)reader["age"],
PersonContact = (string)reader["contact"],
PersonDepartmentID = (string)reader["department"],
PersonGroupID = (string)reader["group"],
PersonLevelEductationID = (string)reader["lavel"],
PersonDivisionID = (string)reader["division"]
});
}
}
return persons;
}
}
}
PersonViewModel
namespace PersonMVVM
{
class PersonViewModel: ViewModelBase
{
public ObservableCollection
PersonItems { get; }
private PersonModel _selectedPersonItem;
public PersonModel SelectedPersonItem
{
get => _selectedPersonItem;
set { _selectedPersonItem = value; OnpropertyChanged(nameof(this.SelectedPersonItem)); }
}
private readonly DataRepository dataRepository;
public PersonViewModel()
{
this.PersonItems = new ObservableCollection();
this.dataRepository = new DataRepository();
}
public void Initialize()
{
// Do not make such potentially long-running and blocking calls from the constructor
IEnumerable personModels = this.dataRepository.GetPersonModels();
foreach (PersonModel personModel in personModels)
{
this.PersonItems.Add(personModel);
}
}
}
MainViewModel
namespace PersonMVVM
{
class MainViewModel: INotifyPropertyChanged
{
public PersonViewModel PersonViewModel { get; } = new PersonViewModel();
public NavigationViewModel NavigationViewModel { get; } = new NavigationViewModel();
public event PropertyChangedEventHandler PropertyChanged;
// Can be async if required
public void Initialize()
{
// Do not make such potentially long-running and blocking calls from the constructor
this.PersonViewModel.Initialize();
}
}
MasterDetailsControl.xaml
MasterDetailsControl.xaml.cs
namespace PersonMVVM
{
public partial class MasterDetailsControl : UserControl
{
public IList ItemsSource
{
get => (IList)GetValue(ItemsSourceProperty);
set => SetValue(ItemsSourceProperty, value);
}
public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register(
nameof(ItemsSource),
typeof(IList),
typeof(MasterDetailsControl),
new FrameworkPropertyMetadata(default));
public DataTemplate ItemTemplate
{
get => (DataTemplate)GetValue(ItemTemplateProperty);
set => SetValue(ItemTemplateProperty, value);
}
public static readonly DependencyProperty ItemTemplateProperty = DependencyProperty.Register(
nameof(ItemTemplate),
typeof(DataTemplate),
typeof(MasterDetailsControl),
new FrameworkPropertyMetadata(default));
public object SelectedDetailsItem
{
get => (object)GetValue(SelectedDetailsItemProperty);
set => SetValue(SelectedDetailsItemProperty, value);
}
public static readonly DependencyProperty SelectedDetailsItemProperty = DependencyProperty.Register(
nameof(SelectedDetailsItem),
typeof(object),
typeof(MasterDetailsControl),
new FrameworkPropertyMetadata(default(object), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public DataTemplate SelectedDetailsItemTemplate
{
get => (DataTemplate)GetValue(SelectedDetailsItemTemplateProperty);
set => SetValue(SelectedDetailsItemTemplateProperty, value);
}
public static readonly DependencyProperty SelectedDetailsItemTemplateProperty = DependencyProperty.Register(
nameof(SelectedDetailsItemTemplate),
typeof(DataTemplate),
typeof(MasterDetailsControl),
new FrameworkPropertyMetadata(default));
public MasterDetailsControl()
{
InitializeComponent();
}
}
MainWindow.xaml
MainWindow.xaml.cs
namespace PersonMVVM
{
public partial class MainWindow : Window
{
private readonly MainViewModel MainViewModel;
public MainWindow()
{
this.MainViewModel = new MainViewModel();
this.DataContext = this.MainViewModel;
InitializeComponent();
// Initialize the view model classes
this.Loaded += OnLoaded;
InitializeComponent();
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
this.MainViewModel.Initialize();
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... using-mvvm
Отображение сведений об объекте выбранного объекта в другом пользовательском элементе управления с использованием MVVM ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Проблема с созданием кнопки в редакторе в пользовательском элементе управления.
Anonymous » » в форуме C# - 0 Ответы
- 48 Просмотры
-
Последнее сообщение Anonymous
-