【发布时间】:2014-02-20 18:32:04
【问题描述】:
我正在尝试将集合绑定到树视图。到目前为止,我的尝试都失败了。 尽管我读过有关此事的文章,但我还是错过了一些东西。
到目前为止,我尝试了类似的东西,但是 Treeview 只是绘制了 A 类的 Id,仅此而已,没有可展开的按钮。
<Grid>
<TreeView HorizontalAlignment="Left" Height="270" VerticalAlignment="Top" Width="292" ItemsSource="{Binding ManagerObjects}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:ManagerObject}" ItemsSource="{Binding MyManager}">
<TextBlock Text="{Binding Id}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Manager}" ItemsSource="{Binding ManagerClientServerProperty}">
<TextBlock Text="{Binding ManagerClientServerProperty}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local1:ManagerClientServer}">
<TextBlock Text="TEST"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local1:NetworkObject}" ItemsSource="{Binding Entities}">
<TextBlock Text="TEST"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local1:RemoteEntity}" ItemsSource="{Binding Fields}">
<TextBlock Text="TEST"/>
<!-- how classD should look like -->
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
</Grid>
编辑:添加真实代码
这是在我的模型中:
public class ManagerObject
{
// PROPERTIES
public int Id { get; private set; }
public Manager MyManager { get; private set; }
}
public class Manager
{
// FIELDS
private readonly ManagerClientServer managerClientServer;
// PROPERTIES
public ManagerClientServer ManagerClientServerProperty { get { return managerClientServer;} }
/**** OTHER STUFF NON IMPORTANT ****/
}
public class ManagerClientServer
{
// FIELDS
private readonly ObservableCollection<NetworkObject> Clients = new ObservableCollection<NetworkObject>();
private readonly ObservableCollection<NetworkObject> Servers = new ObservableCollection<NetworkObject>();
// PROPERTIES
public ObservableCollection<NetworkObject> ClientsProperty
{
get { return Clients; }
}
public ObservableCollection<NetworkObject> ServersProperty
{
get { return Servers; }
}
/*** OTHER STUFF NON IMPORTANT HERE ***/
}
public class NetworkObject
{
// FIELDS
private readonly ObservableCollection<RemoteEntity> _entities=new ObservableCollection<RemoteEntity>();
public uint NetworkId { get; private set; }
// PROPERTIES
public ObservableCollection<RemoteEntity> Entities
{
get { return _entities; }
}
// CONSTRUCTOR
public NetworkObject(uint id)
{
NetworkId = id;
}
}
public class RemoteEntity
{
// FIELDS
private readonly ObservableCollection<int> _fields=new ObservableCollection<int>();
// PROPERTIES
public bool IsLost { get; set; }
public bool NeedUpdate { get; set; }
public uint SessionId { get; private set; }
public ObservableCollection<int> Fields
{
get { return _fields; }
}
// CONSTRUCTOR
public RemoteEntity(uint id)
{
SessionId = id;
}
}
ViewModel 只是暴露了这个属性:
public ObservableCollection<ManagerObject> ManagerObjects
{
get { return managerObjects; }
set
{
managerObjects = value;
NotifyOfPropertyChange(()=>ManagerObjects);
}
}
private ObservableCollection<ManagerObject> managerObjects;
初始化只是 2 个 ManagerObject,之后它们在 Clients 和 Servers 集合中都包含随机数量的 NetworkObjects,并且每个都有随机数量的 Entities。
这里的所有集合都是可观察的,但是,它们实际上是另一种类型,但它们公开了一个可以使它们可观察的方法,所以让我们这样考虑。
非常感谢。
【问题讨论】:
-
您的 ItemsSource 不应该是类的集合吗?这将是一个父子类,我所说的类是指您的实际实体类。我猜你的 collectionClassA 只有一个 1 的项目,其中有 classA。你能显示更多代码吗,比如你的模型和视图模型
-
collectionclassA 是一个 ObservableCollection
,其中包含两个项目。它是我的 ViewModel 的一个属性。 -
您想创建一个 ObservableCollection
,其中包括 ClassA、ClassD、ClassE,其子属性也是 Observable ,其中包含相应的子属性。 -
嗯,我想这已经完成了。当您查看我的模型时:ClassA 包含对 ClassB 的引用,其中包含对 ClassC 的引用,其中包含两个 classD 列表...我想像在调试器中看到的那样绘制 collectionClassA。
-
有人想过吗?