Pregunta

Éste es bastante complejo, espero que pueda hacer que este lo suficientemente claro para que alguien me ayude. Tengo un objeto le permite llamar a un Manager, el Manager tiene un conjunto de personas que se las arregla, las personas de todo poner en práctica IPerson, pero diferentes tipos de personas tienen diferentes propiedades. Quiero mostrar este gerente en un árbol, y bajo el nodo del gestor Quiero mostrar todos los proyectos en los que está gestionando que se puede determinar a partir de la gente que gestiona.

Así que el plan es utilizar un convertidor para convertir a una persona en una lista de proyectos. Aquí está el XAML:

<HierarchicalDataTemplate DataType="{x:Type ui:Manager}">
   <TextBlock Text="{Binding Path=Name}"/>
    <HierarchicalDataTemplate.ItemTemplate>
        <DataTemplate>
                    <TextBlock Text="{Binding}"/>
        </DataTemplate>
    </HierarchicalDataTemplate.ItemTemplate>
    <HierarchicalDataTemplate.ItemsSource>
        <Binding Path="People">
            <Binding.Converter>
                <configUtil:ProjectListConverter/>
            </Binding.Converter>
        </Binding>
    </HierarchicalDataTemplate.ItemsSource>
</HierarchicalDataTemplate>

Mi clase de persona implementa INotifyPropertyChanged, y la lista de la celebración de las personas implementa INotifyCollectionChanged.This código funciona muy bien cuando me puse la vista de árbol ItemsSource, los Administradores se muestran con su lista de proyectos.

Sin embargo, cuando agrego una nueva persona a la lista de las personas, la TreeView no se actualiza. Cuando elimino errores, puedo ver que el CollectionChanged está disparando con la acción Add y el elemento añadido. También el evento CollectionChanged no es nulo, así que sé la interfaz de usuario está viendo. Sin embargo, el convertidor no se ejecuta cuando se añade el artículo.

aquí es el método Add de la Lista de la celebración de los objetos IPerson:

public void Add(T item)
{
    list.Add(item);
    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
}

Soy de alguna manera romper el enlace de datos?

¿Qué otras cosas puedo comprobar?

El convertidor sólo se ve en cada elemento de la lista y la gente se da cuenta de qué proyectos están trabajando y añade el nombre del proyecto a una lista de salida.

¿Fue útil?

Solución

El convertidor se aplica a la propiedad que almacena la colección. Por lo tanto, sólo se llama si la propia instancia de recogida cambia (no si los artículos de la colección se cambian). Una forma de evitar esto sería para invalidar la colección cuando lo desee para refrescar.

La forma más sencilla para invalidar la propiedad de colección y hacer que el código de convertidor a correr de nuevo sería null a cabo la recogida y reasignar la misma. Otra forma es hacer que el BindingExpression ( a través de BindingOperations ) y llamar UpdateTarget . Por último, en su lugar podría unirse a una CollectionView (o subclase del mismo) y llamar Refresh en él.

Y si realmente quieren solucionar el problema limpiamente, podría unirse a su propia implementación de ICollectionView la que hace el filtrado y provoca eventos según sea necesario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top