将treeview绑定到不同集合的属性

时间:2018-02-07 17:50:34

标签: c# winforms treeview

我目前正在将WPF应用程序转换为WinForms应用程序,而且在树视图方面遇到了一些麻烦。

我在设计器中设置了四个节点,如下所示:

this.treeView1.Name = "treeView1";
treeNode1.Name = "shapeNode";
treeNode1.Text = "Shape Files";
treeNode2.Name = "mdbNode";
treeNode2.Text = "MDB Files";
treeNode3.Name = "tiffNode";
treeNode3.Text = "Tiff Files";
treeNode4.Name = "kmlNode";
treeNode4.Text = "KML Files";
this.treeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
treeNode1,
treeNode2,
treeNode3,
treeNode4});

我还有四个可观察的集合,它们应该与每个treeNode对应,特别是这些类型的对象具有的“Name”属性:

public ObservableCollection<ShapeFileFeatureLayer> ShapeFileLayers
{
    get { return mapModel.ShapeFileLayers; }
    set { mapModel.ShapeFileLayers = value; OnPropertyChanged("ShapeFileLayers"); }
}

public ObservableCollection<PersonalGeoDatabaseFeatureLayer> MdbFileLayers
{
    get { return mapModel.MdbFileLayers; }
    set { mapModel.MdbFileLayers = value; OnPropertyChanged("MdbFileLayers"); }
}

public ObservableCollection<GeoTiffRasterLayer> TiffFileLayers
{
    get { return mapModel.TiffFileLayers; }
    set { mapModel.TiffFileLayers = value; OnPropertyChanged("TiffFileLayers"); }
}

public ObservableCollection<KmlFeatureLayer> KmlFileLayers
{
    get { return mapModel.KmlFileLayers; }
    set { mapModel.KmlFileLayers = value; OnPropertyChanged("KmlFileLayers"); }
}

因此,对于其中一个集合中的每个项目,它将填充在正确的节点下。

现在在WPF中,在MVVM之后,我只添加一个新的TreeViewItem,并将它的ItemsSource绑定到viewmodel中的正确集合,并将子节点的上下文/文本绑定到“Name”。但我不能在winforms中做到这一点。实际上,我没有看到父节点或任何可绑定属性的“child”或“items”属性。

每次集合更改时,是否真的必须手动向父节点添加/删除节点?

1 个答案:

答案 0 :(得分:1)

您的情况很难或几乎无法处理。

但我还有另一条建议。

Winforms具有 WPF互操作性的功能。

您必须使用ElementHost控件。您可以在 WPF互操作性下的工具箱中找到此控件。

只需将ElementHost控件添加到您的winform即可。然后将WPF控件添加到ElementHost

如果您有多个WPF控件,请使用所有这些控件创建WPF用户控件,并将用户控件添加到ElementHost

这使得您的工作变得简单,只需更少的代码更改。

有关示例,请查看以下链接

https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.integration.elementhost?view=netframework-4.7.1