在xaml

时间:2018-03-08 19:33:08

标签: c# wpf xaml

源代码可在此处找到:https://www.codeproject.com/Articles/24973/TreeListView

原作者设置的方式是数据填充在xaml本身。我需要在我的ViewModel中创建TreeViewList,但是我无法弄清楚如何在xaml中绑定我自己的TreeViewList以正确显示它。

这是我在后面的代码中创建树并调用窗口的示例。

    public TreeListView TreeList { get; set; } = new TreeListView();

    private void generateTree()
    {
        TreeList.Columns.Add(new GridViewColumn() { Header = "Col1" });
        TreeList.Columns.Add(new GridViewColumn() { Header = "Col2" });
        TreeList.Columns.Add(new GridViewColumn() { Header = "Col3" });
    }

    public ICommand AssemblyTreeCommand => new RelayCommand(AssemblyTree, p => CanAssemblyTree);
    public bool CanAssemblyTree { get; set; } = true;
    private void AssemblyTree(object parameter)
    {
        generateTree();
        AssemblyTreeDialogWindow dialog = new AssemblyTreeDialogWindow()
        {
            DataContext = this,
            Topmost = true
        };
        dialog.ShowDialog();

    }

AssemblyTreeDialog Window类如下所示:

   <local:TreeListView AllowsColumnReorder="True" ItemsSource="{Binding TreeList}">
        <!--Create an item template to specify the ItemsSource-->
        <local:TreeListView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Children}" />
        </local:TreeListView.ItemTemplate>
        <local:TreeListView.Columns>
            <!--Create the first column containing the expand button and the type name.-->
            <GridViewColumn Header="Name" Width="200">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <!--The Expander Button (can be used in any column (typically the first one))-->
                            <local:TreeListViewExpander/>
                            <!--Display the name of the DataElement-->
                            <TextBlock Text="{Binding}"/>
                        </StackPanel>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <!--Create a second column containing the number of children.-->
            <GridViewColumn Header="Children" Width="100">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <!--Display the size of the DataElement-->
                        <TextBlock Text="{Binding Children.Count}" HorizontalAlignment="Right"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <!--Create a third column containing the brush of the material.-->
            <GridViewColumn Header="Brush" Width="100">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <!--Border showing the actual color-->
                            <Border Background="{Binding Brush}" CornerRadius="2"
                                    Width="16" Height="16"
                                    BorderThickness="1" BorderBrush="DarkGray"/>
                            <!--Display the brush-->
                            <TextBlock Text="{Binding Brush}"/>
                        </StackPanel>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </local:TreeListView.Columns>
        <!--Create some sample data-->
        <MaterialGroup>
            <MaterialGroup>
                <DiffuseMaterial Brush="Blue"/>
                <DiffuseMaterial Brush="Red"/>
                <SpecularMaterial Brush="Orange"/>
            </MaterialGroup>
            <EmissiveMaterial Brush="AliceBlue"/>
        </MaterialGroup>
    </local:TreeListView>

有趣的是,如果我绑定行<GridViewColumn Header="Name" Width="200">以便它显示为<GridViewColumn Header="{Binding TreeList}" Width="200">,它就会给我这个:

testcase1

我会尽可能地解释我的最终目标。

系统是一个巨大的零件清单。主表显示所有零件,而子表显示构成该零件的所有零件。所有部件(包括用于创建其他部件的部件)都存在于MainTable中。因此,父部件可能具有一组子部件,每个部件都具有由子部件组成的子部件。这是我尝试使用此工具建模的关系。

我编写的代码将部件列表映射到包含数据的类对象列表中。我将在下面发布。它正在努力映射到TreeView。

Result

我所依据的数据结构是:Treeview with multiple columns

private void generateTree(string PN)
{
    Proces selectedRow = new Proces() { procesId = (int)Vwr.Table.SelectedRow.Row["PID"], procesName = (string)Vwr.Table.SelectedRow.Row["PN"], subProcesses = generateSubtable(PN) };
    processes.Add(selectedRow);
}


public List<Proces> generateSubtable(string PN)
{
    List<Proces> subTable = new List<Proces>();

    foreach (DataRow mplrow in Vwr.Table.Tbl.Rows) if (mplrow["PN"].ToString() == PN)
            MainVM.Modules.AllModules[0].SubVwr.Tables[0].LoadTableQuery.Prms[0].Val = mplrow[0];
    MainVM.Modules.AllModules[0].SubVwr.Tables[0].Tbl = Db.GetTable(MainVM.Modules.AllModules[0].SubVwr.Tables[0].LoadTableQuery);

    foreach (DataRow sub in MainVM.Modules.AllModules[0].SubVwr.Tables[0].Tbl.Rows)
    {
        Proces subItem = new Proces() { procesId = (int)sub["ItemNo"], procesName = sub["PN"].ToString(), subProcesses = generateSubtable(sub["PN"].ToString()) };
        subTable.Add(subItem);
    }

    return subTable;
}

1 个答案:

答案 0 :(得分:0)

找到答案!经过一番相当广泛的搜索,并尝试了许多不同的解决方我想,如果其他人也可能会尝试做同样的事情。

信用: http://dlaa.me/blog/post/9898803