Domanda

Questo è abbastanza complesso, spero di poter fare questa abbastanza chiaro per qualcuno a darmi una mano. Ho un oggetto permette di chiamare un Gestore, il Gestore ha una collezione di persone che riesce, la gente di tutto implementare IPerson, ma diversi tipi di persone hanno proprietà diverse. Voglio visualizzare questo manager in un albero, e sotto il nodo del gestore che voglio mostrare tutti i progetti che sta gestendo che può essere determinato dal popolo riesce.

Quindi il piano è quello di utilizzare un convertitore per convertire una persona in un elenco di progetti. Ecco l'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>

La mia classe Person implementa INotifyPropertyChanged, e la lista tenendo le persone implementa INotifyCollectionChanged.This codice funziona grande quando ho impostato il TreeView ItemsSource, i gestori sono visualizzate con il loro elenco dei progetti.

Tuttavia, quando aggiungo una nuova persona alla lista di persone, TreeView non viene aggiornato. Quando metto a punto, posso vedere che la CollectionChanged è sparare con l'azione Add e l'elemento aggiunto. Anche l'evento CollectionChanged non è nullo quindi so che l'interfaccia utente sta guardando. Ma il convertitore non viene eseguito quando si aggiunge la voce.

qui è il metodo Add per la Lista tenendo gli oggetti IPerson:

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

Sono in qualche modo rompere l'associazione dati?

Quali altre cose che posso controllare?

Il convertitore lo guarda ogni voce dell'elenco Persone e capisce quali progetti su cui stanno lavorando e aggiunge il nome del progetto a una lista di output.

È stato utile?

Soluzione

Il convertitore è applicata alla proprietà che memorizza la raccolta. Pertanto, sarà chiamato solo se l'istanza raccolta stessa cambia (non se elementi nell'insieme vengono modificati). Un modo per aggirare questo sarebbe per invalidare la raccolta quando si desidera aggiornare.

Il modo più semplice per invalidare la proprietà della raccolta e causare il codice convertitore per eseguire di nuovo sarebbe quello di null la raccolta e riassegnare esso. Un altro modo è quello di ottenere il BindingExpression ( via BindingOperations ) e chiamare UpdateTarget . Infine, si potrebbe invece legarsi ad una CollectionView (o sottoclasse di esso) e chiamare Refresh su di esso.

E se davvero vuole risolvere il problema in modo pulito, si potrebbe associare a una propria implementazione di ICollectionView che fa il filtraggio e genera eventi come necessario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top