WPF MVVM Treeview 未填充

温迪塞尔

我对 MVVM 相当陌生。我的应用程序的其余内容工作正常,除了我似乎无法填充的 treeView。

我一直在使用这个例子

我有一个 MessageTree 对象,如下所示:

public class MessageTree
{
    public MessageTree(string message, MessageSeverity severity)
    {
        Message = message;
        MessageSeverity = severity;
    }
    public  MessageSeverity MessageSeverity { get; set; }


    public string Message { get; set; }

    public List<MessageTree> Children { get; set; }

    public MessageTree AddChild(string message, MessageSeverity severity)
    {
        var child = new MessageTree(message, severity);
        return AddChild(child);
    }

    public MessageTree AddChild(MessageTree child)
    {
        if (Children == null)
        {
            Children = new List<MessageTree>();
        }
        Children.Add(child);
        return child;
    }

    public void Add(List<MessageTree> nodes)
    {
        if(Children == null)
        {
            Children = new List<MessageTree>();
        }
        Children.AddRange(nodes);
    }

    public override string ToString()
    {
        return ToString(0);
    }

    public string ToString(int depth)
    {
        var ret = new StringBuilder();
        ret.Append(new string('\t', depth));
        ret.AppendLine(Message);
        if (Children != null)
        {
            foreach(var child in Children)
            {
                ret.AppendLine(child.ToString(depth + 1));
            }
        }
        return ret.ToString();
    }

    public void ToConsole()
    {
        ToConsole(0);
    }

    public void ToConsole(int depth)
    {
        var tabs = new string('\t', depth);
        Console.WriteLine($"{tabs}{Message}");
        if (Children != null)
        {
            foreach (var child in Children)
            {
                child.ToConsole(depth + 1);
            }
        }
    }

    public MessageSeverity InheritedSeverity
    {
        get
        {
            if (Children == null)
            {
                return MessageSeverity;
            }

            var errors = Children.Where(c => c.InheritedSeverity == MessageSeverity.Error);
            if (errors.Any())
            {
                return MessageSeverity.Error;
            }

            var warnings = Children.Where(c => c.InheritedSeverity == MessageSeverity.Warning);
            if (warnings.Any())
            {
                return MessageSeverity.Warning;
            }

            return MessageSeverity.None;
        }
    }
}

然后,在我的 viewModel

  private MessageTree _tree;

  public MessageTree Tree
  {
      get => _tree;
      set
      {
          _tree = value;
          OnPropertyChanged(nameof(Tree));
      }
  }

  public void Validate()
  {
      Tree = Validate(Remittance) ?? throw new ArgumentNullException($"Validate(Remittance)");
  }
  ...

我的看法 :

<UserControl x:Class="ConveyorFrontEnd.Controls.RemittanceValidator"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:ConveyorFrontEnd.Controls"
         xmlns:common="clr-namespace:Teragra.Common;assembly=Teragra.Common"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
<Grid>
    <TreeView ItemsSource="{Binding Tree}">
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type common:MessageTree}" ItemsSource="{Binding Path=Children}">
                <TextBlock Text="{Binding Path=Message}" />
            </HierarchicalDataTemplate>
        </TreeView.Resources>
    </TreeView>
    <!--<Button Grid.Column="0" Content="Validate" Command="{Binding Path=ValidateCommand}"/>-->
</Grid>

在调试我的项目时,Tree 对象至少填充了一项,Children 中有一个元素。但是,视图上没有显示任何内容,输出中也没有显示任何内容。当我将视图的绑定更改为不存在的内容时,例如 Binding TreeBreakHere,它指定它无法找到 TreeBreakHere,因此它清楚地获取了绑定。我还将 textBlock 更改为不是绑定,而是更改为诸如 Text="TextGoesHere" 之类的常量,但它仍然不显示任何内容。

我相当有信心我的问题在于我试图指定树结构的方式,但似乎无法找出我哪里出错了。谁能把我推向正确的方向?

温迪塞尔

问题出在 treeView 中的 ItemSource 上。

我绑定到单个元素,如下所示:

<TreeView ItemsSource="{Binding Tree}">

绑定应该是可枚举的,而不是单个元素

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章