0

我需要使用 ObservableCollection 并且只有一个类。这是我的代码。出于某种原因,我无法让 TreeView 填充 Observable Collection 。任何帮助,将不胜感激。

XAML:

<UserControl x:Class="ValidationWPF.ValidationUserControl"
             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:telerik="http://schemas.telerik.com/2008/xaml/presentation"
             xmlns:local="clr-namespace:ValidationWPF.DataSources"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.Resources>
        <local:ValidationItem x:Key="ValidationMessages" />

        <DataTemplate x:Key="Messages">
            <TextBlock Text="{Binding Messages}" />
        </DataTemplate>

        <HierarchicalDataTemplate x:Key="SubItem" ItemTemplate="{StaticResource Messages}" ItemsSource="{Binding Messages}" >
            <TextBlock Text="{Binding subItem}" />
        </HierarchicalDataTemplate>

        <HierarchicalDataTemplate  ItemTemplate="{StaticResource SubItem}" x:Key="ItemTemplate"
                ItemsSource="{Binding subItem}">
            <TextBlock Text="{Binding item}" FontWeight="Bold" />
        </HierarchicalDataTemplate>

    </UserControl.Resources>

    <Grid>
        <telerik:RadTreeView ItemsSource="{Binding Source={StaticResource ValidationMessages}}"
                ItemTemplate="{StaticResource ItemTemplate}" x:Name="RadTreeView"/> 
    </Grid>
</UserControl>

班级:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;

namespace ValidationWPF.DataSources
{
    class ValidationItem : ObservableCollection<ValidationItem>
    {
        public ValidationItem()
        {
        }

        public ValidationItem(Item item, SubItem subItem, string Messages)
        {
            this.item = item;
            this.subItem = subItem;
            this.Message = Messages;
        }

        public string Message { get; set; }

        public SubItem subItem { get; set; }

        public Item item { get; set; }

        public ObservableCollection<ValidationItem> ValidationItems
        {
            get
            {
                Add(new ValidationItem(Item.Customer, SubItem.Name, "Customer Name Cannot be Null"));
                Add(new ValidationItem(Item.Customer, SubItem.Phone, "Phone number cannot be Null"));
                Add(new ValidationItem(Item.Customer, SubItem.Phone, "Phone number must be in the format (###)###-####"));
                Add(new ValidationItem(Item.Customer, SubItem.Address, "Customer Address cannot be Null"));
                return ValidationItems;
            }
        }
    }

    public enum Item
    {
        Customer
    }

    public enum SubItem
    {
        Address,
        Phone,
        Name
    }
}
4

1 回答 1

1

更新:好的,这里发生了很多事情,所以需要一段时间才能真正理解。两件事情。

将模型的默认构造函数更改为

public ValidationItem()
    {
        Add(new ValidationItem(Item.Customer, SubItem.Name, "Customer Name Cannot be Null"));
        Add(new ValidationItem(Item.Customer, SubItem.Phone, "Phone number cannot be Null"));
        Add(new ValidationItem(Item.Customer, SubItem.Phone, "Phone number must be in the format (###)###-####"));
        Add(new ValidationItem(Item.Customer, SubItem.Address, "Customer Address cannot be Null"));
    }

另一种是更改您的“subItem”属性。HierarchicalDataTemplate 期望 ItemsSource 是一个 IEnumerable。所以将属性更改为

public IEnumerable<SubItem> subItems

即使您只有一个,也将其设为 IEnumerable。您还需要将 HierarchicalDataTemplates 更改为

    <HierarchicalDataTemplate x:Key="SubItem">
        <TextBlock Text="{Binding}" />
    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate ItemTemplate="{StaticResource SubItem}" x:Key="ItemTemplate"
            ItemsSource="{Binding subItems}">
        <TextBlock Text="{Binding item}" FontWeight="Bold" />
    </HierarchicalDataTemplate>

它还有助于调试您的应用程序并查看“输出”窗口。如果有任何绑定问题,它会告诉你。像“错误绑定,找不到属性'消息'”之类的东西。

于 2012-05-22T19:36:56.883 回答