Родитель-ребенок (дети) - (Многие) внуки | C# MVVM Caliburn Micro - PullRequest
0 голосов
/ 28 апреля 2020

В проекте 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>
...