我有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; }
}
}
我想绑定到视口只有所有对象的OtherProperty,没有层次结构。 Viewport提供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; }