TransferValue - 在 TreeView ItemsSource 中生成的隐式转换器 <null>

Posted

技术标签:

【中文标题】TransferValue - 在 TreeView ItemsSource 中生成的隐式转换器 <null>【英文标题】:TransferValue - implicit converter produced <null> in TreeView ItemsSource 【发布时间】:2021-10-03 11:55:25 【问题描述】:

由于某种原因,该值被正确创建,然后被某些“隐式转换器”拒绝,我不知道为什么。下面是代码的快速概览,但首先是诊断消息:

System.Windows.Data Warning: 95 : BindingExpression (hash=63646052): Got PropertyChanged event from MainViewModel (hash=17472816)
System.Windows.Data Warning: 101 : BindingExpression (hash=63646052): GetValue at level 0 from MainViewModel (hash=17472816) using RuntimePropertyInfo(TestNodeRoot): HierarchicalTestNode (hash=53650690)
System.Windows.Data Warning: 80 : BindingExpression (hash=63646052): TransferValue - got raw value HierarchicalTestNode (hash=53650690)
System.Windows.Data Warning: 84 : BindingExpression (hash=63646052): TransferValue - implicit converter produced <null>
System.Windows.Data Warning: 89 : BindingExpression (hash=63646052): TransferValue - using final value <null>

接下来是树视图绑定。跟踪已启用,如您所见:

    <TreeView ItemsSource="Binding TestNodeRoot, diag:PresentationTraceSources.TraceLevel=High">
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="x:Type models:HierarchicalTestNode" ItemsSource="Binding Children, diag:PresentationTraceSources.TraceLevel=High">
                <TextBlock Text="Binding Name"/>
            </HierarchicalDataTemplate>
        </TreeView.Resources>
    </TreeView>

TestNodeRoot 绑定是到视图模型中的 ObservableAsPropertyHelper&lt;HierarchicalTestNode?&gt;,它被连接到 Solution 属性更改(请注意,这是有效的,因为绑定获取此值,如上所示):

    readonly ObservableAsPropertyHelper<HierarchicalTestNode?> testNodeRoot;
    public HierarchicalTestNode? TestNodeRoot => testNodeRoot.Value;

    this.WhenAnyValue(x => x.Solution).Select(s => s is null ? null : HierarchicalTestNode.Create(s.TestNodes!))
        .ToProperty(this, x => x.TestNodeRoot, out testNodeRoot);

最后,HierarchicalTestNode 是一个简单的 ReactiveObject,它包含属性(请注意,Children 属性是 XAML HierarchicalDataTemplate 所期望的可观察集合,尽管我没有到达那里):

public class HierarchicalTestNode : ReactiveObject

    string name;
    public string Name  get => name; set => this.RaiseAndSetIfChanged(ref name, value); 

    bool cloak;
    public bool Cloak  get => cloak; set => this.RaiseAndSetIfChanged(ref cloak, value); 

    int displayIndex;
    public int DisplayIndex  get => displayIndex; set => this.RaiseAndSetIfChanged(ref displayIndex, value); 

    TestNodeType nodeType;
    public TestNodeType NodeType  get => nodeType; set => this.RaiseAndSetIfChanged(ref nodeType, value); 

    public ObservableCollection<HierarchicalTestNode> Children  get;  = new();

    // other stuff for creating it from a flat database, this also works

那么知道内部转换器试图做什么吗?我不认为TreeView 期望从我在网上看到的任何特定类型的类,并且我没有传递接口(我读到这可能会导致问题),所以出了什么问题?

【问题讨论】:

ItemsSource 绑定需要一个 IEnumerable 或可以转换为 IEnumerable 的源属性。 HierarchicalTestNode 是这样吗,即 TreeView 上的 ItemsSource 绑定?或者你打算写ItemsSource="Binding TestNodeRoot.Children" 哦,伙计,我知道这一定是一些愚蠢的事情......不,这个想法是让一棵树只有一个根节点。让我快速尝试一下,但您很可能是正确的。 【参考方案1】:

正如 Clemens 在他的评论中指出的那样,问题是即使我只有一个根节点,ItemsSource 属性也需要一个可枚举的。将根转换为一个项目的数组解决了我的问题。

【讨论】:

以上是关于TransferValue - 在 TreeView ItemsSource 中生成的隐式转换器 <null>的主要内容,如果未能解决你的问题,请参考以下文章

WPF C# TreeView 获取所选项目的文本

当所有子项都折叠或隐藏时,如何在分层数据模板中隐藏扩展器?

C#如何实现树型菜单

echarts tree控制节点的展开收起

作为 Web 应用程序的实时更新树视图 [关闭]

关于的Delphi 的treeview控件的用法请教大家