Отображение сведений об объекте выбранного объекта в другом пользовательском элементе управления с использованием MVVMC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Отображение сведений об объекте выбранного объекта в другом пользовательском элементе управления с использованием MVVM

Сообщение Anonymous »

У меня есть список людей, заполненный из базы данных, два поля (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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»