树视图项源绑定到视图模型不更新 xaml 控件的项



我正在创建一个UserControl(让我们称之为ViewTree)包装一个TreeView元素。在viewtree . example .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 . example .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}">

但是,当我试图访问viewtree . example .cs中的trvMenu.Items时,它显示为空。我在viewTree.UpdateTreeSource(nextTreeSource);之后放了一个断点,可以验证viewTree.trvMenu.Items里面有孩子。

如果我直接绑定到DependencyProperty,它工作得很好,但我仍然更喜欢ViewModel绑定。

如果有人能指出我哪里做错了,或者这只是WPF的工作方式,我将不胜感激。提前感谢。

经过更多的调试,我发现了这个问题,这完全是我的错,与DP或VM绑定无关。

我有2个消费者的ViewTree控件。在ViewTree I中订阅一个事件,当它触发时,两个ViewTree元素都调用处理程序。

在其中一个消费者的ViewTree上抛出异常,其中TreeSource没有初始化。

相关内容

  • 没有找到相关文章

最新更新