0

我正在创建一个包装 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 的工作方式,我将不胜感激?

提前致谢。

4

1 回答 1

0

再调试一下,我发现了问题,完全是我的错,与DP或VM绑定无关。

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

在未初始化 TreeSource 的消费者 ViewTree 上引发了异常。

于 2021-10-01T06:40:08.867 回答