我目前正在将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”属性。
每次集合更改时,是否真的必须手动向父节点添加/删除节点?
答案 0 :(得分:1)
您的情况很难或几乎无法处理。
但我还有另一条建议。
Winforms具有 WPF互操作性的功能。
您必须使用ElementHost
控件。您可以在 WPF互操作性下的工具箱中找到此控件。
只需将ElementHost
控件添加到您的winform即可。然后将WPF控件添加到ElementHost
。
如果您有多个WPF控件,请使用所有这些控件创建WPF用户控件,并将用户控件添加到ElementHost
。
这使得您的工作变得简单,只需更少的代码更改。
有关示例,请查看以下链接