Usando HierarchicalDataTemplate y Observable en WPF

Necesito usar un ObservableCollection y solo una clase. Aquí está mi código. Por alguna razón, no puedo hacer que TreeView se complete con Observable Collection. Cualquier ayuda sería apreciada.

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>

CLASE:

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
    }
}

preguntado el 22 de mayo de 12 a las 20:05

¿ValidationItem es realmente privado? -

1 Respuestas

ACTUALIZACIÓN: OK, están sucediendo muchas cosas aquí, así que tomó un tiempo entenderlo realmente. Dos cosas.

Cambie el constructor predeterminado de su modelo a

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"));
    }

La otra es cambiar su propiedad "subItem". HierarchicalDataTemplate espera que ItemsSource sea un IEnumerable. Así que cambia la propiedad para que sea

public IEnumerable<SubItem> subItems

Incluso si solo tiene uno, conviértalo en IEnumerable. También deberá cambiar sus HierarchicalDataTemplates a

    <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>

También ayuda a depurar su aplicación y ver la ventana de salida. Si hay algún problema de encuadernación, se lo dirá. Algo así como "Error de enlace, no se pudo encontrar la propiedad 'Mensajes'".

contestado el 22 de mayo de 12 a las 21:05

No. Actúa como si no hubiera nada en la Colección Observable... Se compila y funciona bien sin ningún error. Creo que podría haber un problema cuando estoy agregando cosas a mi colección observable. - JLott

Hice un gran cambio en mi publicación una vez que realmente entendí lo que estás haciendo. - shawn kendrot

Gracias por tu ayuda. Terminé tomando una dirección completamente nueva y agregando listas a colecciones observables. - JLott

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.