【问题标题】:WPF MVVM Treeview not populatingWPF MVVM 树视图未填充
【发布时间】:2018-08-19 12:12:51
【问题描述】:

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

我一直在用这个example

我有一个 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" 之类的常量,但它仍然不显示任何内容。

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

【问题讨论】:

    标签: c# wpf mvvm treeview


    【解决方案1】:

    问题出在树视图中的 ItemSource。

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

    <TreeView ItemsSource="{Binding Tree}">
    

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

    【讨论】:

      猜你喜欢
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      相关资源
      最近更新 更多