Как отобразить свойства в DataGrid в DataGrid с помощью Cailburn.Micro - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь представить 2 DataGrids как детали для выбранной строки в прилагаемой DataGrid. ViewModel имеет помимо пары строковых свойств два списка, которые должны отображаться, если выбрана строка. После выбора строки в StdMolecules DataGrid должна отображаться подробная информация о строке. Детали строк в ViewModel называются Molecules и Elements и устанавливаются после выбора ряда для молекул и элементов SelectedMolecule, который является MoleculeModel.

ViewModel выглядит так (сводная таблица опущена для краткости)

public class MoleculeManagementViewModel : Screen
{
   :
   :
   public int Id {...}    // all properties with backingfields and Notify
   public string Name {...}
   public string MolecularFormula {...}

   public BindableCollection<MoleculeModel> Molecules {...}
   public BindableCollection<ElementModel> Elements {...}

   public BindableCollection<MoleculeModel> StdMolecules {...}

   public MoleculeModel SelectedMolecule {...}
   :
   :
}

MoleculeModel и ElementModel являются следующими

public class MoleculeModel
{
   public int Id {..}
   public int Name {..}
   public int MolecularFormula {..}

   public List<MoleculeModel> Molecules {...} // every molecule may have other molecules as building blocks
   public List<ElementModel> Elements {...} // elements forming a molecule
}

public class ElementModel
{
   public int Id {..}
   public int Name {..}
   public int Symbol {..}
}

Я использовал следующий XAML для представления структуры данных внутри объекта Page-Object. Я только попытался отобразить свойство Id списка Molecuels, поскольку, как только механизм будет понят, другой последует.

Но мне не удалось это осуществить. : - (

<StackPanel Orientation="Vertical">
    <Grid Margin="10">
        <DataGrid x:Name="StdMolecules" AutoGenerateColumns="False" SelectedItem="{Binding SelectedMolecule}" 
                  CanUserAddRows="False" CanUserDeleteRows="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Id" Binding="{Binding Id}"/>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
                <DataGridTextColumn Header="Strukturfomel" Binding="{Binding MolecularFormula}"/>
            </DataGrid.Columns>
            <DataGrid.RowDetailsTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Margin="5">
                        <!-- Constituent Molecule Grid -->
                        <Grid Margin="5">
                            <DataGrid x:Name="Molecules" AutoGenerateColumns="False" 
                                      CanUserDeleteRows="False" CanUserAddRows="False">
                                <DataGrid.Columns>
         <!-- I try to display the 'Id' property of each molecule in the 'Molecules' in the ViewModel -->
                                    <DataGridTextColumn Header="Id" Binding="{Binding MoleculeModel.Id}"/>
                                    <DataGridTextColumn Header="Name" />
                                    <DataGridTextColumn Header="Strukturformel"/>
                                </DataGrid.Columns>
                            </DataGrid>
                        </Grid>
                        <!-- Constituent Element Grid -->
                        <Grid Margin="5">
                            <DataGrid x:Name="Elements" AutoGenerateColumns="False" 
                                      CanUserDeleteRows="False" CanUserAddRows="False">
                                <DataGrid.Columns>
                                    <DataGridTextColumn Header="Id"/>
                                    <DataGridTextColumn Header="Name"/>
                                    <DataGridTextColumn Header="Symbol"/>
                                </DataGrid.Columns>
                            </DataGrid>
                        </Grid>
                    </StackPanel>
                </DataTemplate>
            </DataGrid.RowDetailsTemplate>
        </DataGrid>
    </Grid>
</StackPanel>

Я пробовал несколько разных способов отображения Id молекулы, но ни один из них не удался.

Я был бы признателен, если бы мог получить подсказку, как это сделать правильно.

Ура, Питер

1 Ответ

0 голосов
/ 20 июня 2019

Привязать прикрепленное свойство cal:Bind.Model к MoleculeModel:

<DataGrid.RowDetailsTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal" Margin="5">
            <Grid Margin="5">
                <DataGrid x:Name="Molecules" cal:Bind.Model="{Binding}"
                        AutoGenerateColumns="False" 
                        CanUserDeleteRows="False" CanUserAddRows="False">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Id" Binding="{Binding Id}"/>
                        //...
                    </DataGrid.Columns>
                </DataGrid>
            </Grid>
            ...
        </StackPanel>
    </DataTemplate>
</DataGrid.RowDetailsTemplate>
...