我有带有实体的 viewport3d,以及带有实体层次结构的树视图。Treeview 是从类层次结构中绑定的,如下所示:
public class SomeDataObject
{
private ObservableCollection<SomeDataObject> _children;
private string _OtherProperty;
public SomeDataObject()
{
this._children = new ObservableCollection<SomeDataObject>();
//other initialization
}
public ObservableCollection<SomeDataObject> Children
{
get
{
return this._children;
}
set{ _children = value; }
}
public string OtherProperty
{
get
{
return this._OtherProperty;
}
set{ _OtherProperty = value; }
}
}
我想只绑定到所有对象的其他属性的视口,没有层次结构。视口提供来自 ObservableCollection 的绑定,但不包括祖先。因此无法访问较低级别的 OtherProperty。
我考虑了两个独立的视图模型,但我不知道如何设计不同视图模型之间的通信。
我找到了解决方案: http: //blog.quantumbitdesigns.com/2008/07/22/programmatically-selecting-an-item-in-a-treeview/ 但当然这是迂回的方式。我想自动更新视图模型和模型中的更改。
在这种情况下,最好的解决方案是什么?
编辑:这是树视图的 XAML:
<TreeView Grid.Column="0" Name="MainTreeView">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type WpfTreeViewTricks:SomeDataObject}" ItemsSource="{Binding Path=Children}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="TreeViewItem:"/>
<TextBlock Margin="1,0,0,0" Text="{Binding Path=OtherProperty}"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
这是工作。
问题在于将该层次结构绑定到视口,beacase视口允许以下列方式绑定:
<ht:HelixViewport3D ItemsSource="{Binding Objects}" Background="{ht:LinearGradientBrush Gray, White}"/>
其中 Objects 是 DataContext 的一个属性:
public ObservableCollection<Visual3D> Objects { get; set; }