В проекте C# WPF, построенном по модели MVVM с использованием Caliburn Micro, упрощенное описание архитектуры, среды, целей и проблем, с которыми сталкиваются, выглядит следующим образом:
Помимо ShellView + VM (родительский объект) ), есть 2 VM (ProdA и ProdB) с их собственными представлениями (пользовательский контроль) - (впредь ProdA и ProdB называются дочерними). Внешний интерфейс WPF очень прост с 2 кнопками (ProdA и ProdB). Нажатие любой кнопки загружает записи ProdA или ProdB из БД SQL 2017 (SELECT * FROM
) в элемент управления содержимым (сетку данных) ShellView / Parent (Control1). Это та часть, которая подключена и работает нормально (код приведен ниже). Все идет нормально. А теперь поставленные задачи / проблема.
В ShellView / Parent (Control2) есть еще один элемент управления контентом. Это в настоящее время пусто. Идея состоит в том, что когда пользователь щелкает в любой ячейке Control1, второй элемент управления контентом должен быть заполнен соответствующим контентом. Например, сетка данных для ProdA отображает «Страна», «Грузоотправитель» и «Идентификатор заказа» в своих столбцах - если пользователь щелкает любую ячейку «Страна», тогда Control2 должен показывать записи из TblCountry БД, передавая страну «щелкнул» к хранимой процедуре - если пользователь щелкает любую ячейку «Отправитель», то Content2 должен иметь записи из TblShipper, передавая выбранного Отправителя в хранимую процедуру. Что наиболее важно, нажатие в любой ячейке OrderID должно вызвать SP, чтобы вызвать OrderDetails для этого OrderID. Эта форма должна быть редактируемой, а любые сделанные изменения необходимо отправить обратно на SQL (с использованием обновления SP).
Единственный код, который я могу предложить, это то, где заполняется первая таблица данных для Продуктов. Любые попытки даже начать работу над control2 привели только к тому, что веб-поиски Фрэнти c оставили меня без ответа - а также полностью запутали
По сути, я ищу направление в том, как мыслить через внуков, учитывая выше реальности
ShellViewMode.cs
using Caliburn.Micro;
using System;
using System.Collections.Generic;
[Truncated for brevity]
namespace WPFUI.ViewModels
{
public class ShellViewModel : Conductor<object>
{
public void ProdA()
{
ActivateItem(new ProdAViewModel());
}
public void ProdB()
{
ActivateItem(new ProdBViewModel());
}
}
}
ShellView.xaml
<Window x:Class="WPFUI.Views.ShellView"
[Truncated for brevity]
Title="ShellView" Height="450" Width="800" Background="Beige">
<Grid>
<DockPanel Height="60" VerticalAlignment="Top" >
<Button x:Name="ProdA" Width="80" Content="Button 1" Margin="30,10,40,10"/>
<Button x:Name="ProdB" Width="80" Content="Button 2" Margin="30,10,40,10"/>
</DockPanel>
<ContentControl x:Name="ActiveItem" Margin="20,100,20,20">
</ContentControl>
**[This is where content control 2 will be that houses the grandchildren data]**
</Grid>
</Window>
ProdAViewModel.cs
public class ProdAViewModel
{
private BindableCollection<ProdAModel> _lstProdA;
public BindableCollection<ProdAModel> LstProdA
{
get { return _lstProdA; }
set { _lstProdA= value; }
}
public ProdAViewModel()
{
var data = LoadProdARecords(); //Name of method in business layer to pull out ProdA from DB
_lstProdA= new BindableCollection<ProdAModel>();
foreach (var row in data)
{
_lstCHARecList.Add(new ProdAModel
{**[Assigment to ProdAModel properties }**);
}
}
ProdAView.xaml
<UserControl x:Class="WPFUI.Views.ProdAView"
[Truncated]
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
[Remaining truncated]
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
[Remaining truncated]
</Grid.ColumnDefinitions>
<DataGrid Grid.Row="0" Grid.ColumnSpan="4" Name="LstProdA" AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Country}" Header="Country Name" IsReadOnly="True"/>
<DataGridTextColumn Binding="{Binding Shipper}" Header="Shipper Name" IsReadOnly="True"/>
<DataGridTextColumn Binding="{Binding OrderId}" Header="Order ID" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
</Grid>