【问题标题】:How to display properties in a DataGrid within a DataGrid with Cailburn.Micro如何使用 Cailburn.Micro 在 DataGrid 内的 DataGrid 中显示属性
【发布时间】:2019-06-19 15:34:18
【问题描述】:

我正在尝试将 2 个 DataGrids 显示为封闭 DataGrid 中选定行的详细信息。 ViewModel 除了几个字符串属性外,还有两个列表,如果选择了一行,则应该显示这些列表。在StdMolecules DataGrid 中选择一行后,应显示行详细信息。 ViewModel 中的行详细信息称为MoleculesElements,一旦为SelectedMoleculeMoleculeModel)的分子和元素选择了一行,就会对其进行设置。

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 {...}
   :
   :
}

MoleculeModelElementModel如下

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 来呈现页面对象中的数据结构。我只尝试显示Molecuels 列表的Id 属性,因为一旦了解机制,其他机制就会随之而来。

但我还没有成功。 :-(

<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,但都没有成功。

如果我能得到正确的提示,我将非常感激。

干杯, 彼得

【问题讨论】:

    标签: c# wpf datagrid caliburn.micro


    【解决方案1】:

    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>
    

    【讨论】:

    • 感谢您的建议。我试过了,数据网格显示在详细数据网格中,但详细数据网格没有显示任何信息 - 只是空白单元格。知道我错过了什么吗?
    • 真的谢谢你,你的提示让我走上了正轨。添加cal:Bind.Model="{Binding}" 后,我只需要更改数据网格文本列绑定,例如对于MoleculeModel.Id,到Binding="{Binding=Id}",它就像一个魅力!凉爽的! :-)
    • @mph:当然你不应该在绑定路径中包含 MoleculeModel。我编辑了我的答案。
    猜你喜欢
    • 2021-10-24
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2023-03-03
    • 2015-11-11
    相关资源
    最近更新 更多