我正在创建一个包装 TreeView 元素的 UserControl(我们称之为 ViewTree)。在 ViewTree.xaml.cs 我有一个Source依赖属性:
public static readonly DependencyProperty SourceProperty
= DependencyProperty.Register (
"Source",
typeof (ObservableCollection<TreeItem>),
typeof (ViewTree),
new FrameworkPropertyMetadata (new ObservableCollection<TreeItem>(), OnSourceChanged)
);
public ObservableCollection<TreeItem> Source
{
get { return (ObservableCollection<TreeItem>)GetValue(SourceProperty); }
set { SetValue(SourceProperty, value); }
}
...以便此 UserControl 的使用者可以进行输入绑定:
<features:ViewTree Source="{Binding Path=...}">
然而,在 ViewTree UserControl 中,我并不想直接绑定到这个 DependencyProperty。相反,我想绑定到 ViewModel 中的另一个属性(使用 Prism),所以我在 ViewTree.xaml.cs 中执行了此操作:
private static void OnSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var nextTreeSource = e.NewValue as ObservableCollection<TreeItem>;
if (nextTreeSource == null)
{
return;
}
var viewTree = d as ViewTree;
viewTree.UpdateTreeSource(nextTreeSource);
}
public void UpdateTreeSource(ObservableCollection<TreeItem> treeSource)
{
var vm = trvMenu.DataContext as ViewTreeViewModel;
vm.TreeSource = treeSource;
}
在我的 ViewTree.xaml 中,我有以下内容,并且树节点正常存在:
<TreeView Name="trvMenu" ItemsSource="{Binding Path=TreeSource}">
但是,当我尝试trvMenu.Items在 ViewTree.xaml.cs 中访问时,它显示为空。我在后面放了一个断点viewTree.UpdateTreeSource(nextTreeSource);,可以验证viewTree.trvMenu.Items里面有孩子。
如果我直接绑定到 DependencyProperty,它可以正常工作,但我仍然更喜欢 ViewModel 绑定。
如果有人能指出我做错了什么,或者它只是 WPF 的工作方式,我将不胜感激?
提前致谢。