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<HierarchicalTestNode?>
,它被连接到 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>的主要内容,如果未能解决你的问题,请参考以下文章