У меня есть список людей, заполненный из базы данных, два поля (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#
Место общения программистов C#
1722495714
Anonymous
У меня есть список людей, заполненный из базы данных, два поля (id, имя) из объекта человека привязаны к данным с помощью переключателя, теперь, когда я нажимаю на переключатель, я открываю новый UserControl и пытаюсь показать все поля выбранного объекта в UserControl подробно.
как это реализовать в mvvm?
[b]Модель:[/b]
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; }
}
}
[b]ViewModelBase[/b]
namespace PersonMVVM
{
class ViewModelBase: INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnpropertyChanged([CallerMemberName] string propName =
null)
{
PropertyChanged?.Invoke(this, new
PropertyChangedEventArgs(propName));
}
}
}
[b]Репозиторий данных[/b]
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;
}
}
}
[b]PersonViewModel[/b]
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);
}
}
}
[b]MainViewModel[/b]
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();
}
}
[b]MasterDetailsControl.xaml[/b]
[b]MasterDetailsControl.xaml.cs[/b]
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();
}
}
[b]MainWindow.xaml[/b]
[b]MainWindow.xaml.cs[/b]
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();
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78768528/showing-object-details-of-a-selected-object-in-another-usercontrol-using-mvvm[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия