Come ottenere aggiornato automaticamente WPF TreeViewItems con valori basati sulle proprietà di classi .NET?

StackOverflow https://stackoverflow.com/questions/4533107

Domanda

Buongiorno. Ho una classe con i dati derivati ??da InotifyPropertyChange. I dati provengono da un thread in background, che cerca i file con determinata estensione in certi luoghi. Proprietà pubblica dei reagisce classe per un evento onPropertyChange aggiornando i dati in un thread separato. Inoltre, ci sono descritti in XAML TreeView, basato su HierarhicalDataTemplates. Ogni TextBlock all'interno modelli forniti ItemsSource = "{Binding FoundFilePaths, Mode = OneWay, NotifyOnTargetUpdated = True}".

 <TreeView  x:Name="FoundFiles_TreeView"  Opacity="15" Background="White"   BorderThickness="5" FontFamily="Arial" Margin="0,0,0,0" RenderTransformOrigin="0.5,0.5" VerticalAlignment="Top" Height="360" FontWeight="Bold" Foreground="#FF539DBE" TargetUpdated="FoundFiles_TreeView_TargetUpdated">
            <TreeView.ItemContainerStyle >
                <Style TargetType="{x:Type TreeViewItem}">
                    <Setter Property="TreeViewItem.Tag" Value="InfoNode" />
                    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                    <Setter Property="Foreground" Value="Brown"/>
                    <Style.Triggers>
                        <Trigger Property="IsMouseCaptured" Value="True">
                            <Setter Property="IsSelected" Value="True"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TreeView.ItemContainerStyle>
            <TreeView.Resources>
                <HierarchicalDataTemplate  DataType = "{x:Type lightvedo:FilesInfoStore}"  ItemsSource="{Binding FoundFilePaths, Mode=OneWay, NotifyOnTargetUpdated=True}">
                    <!--Здесь указываются узлы дерева-->
                    <StackPanel x:Name ="TreeNodeStackPanel" Orientation="Horizontal">
                        <TextBlock Margin="5,5,5,5" TargetUpdated="TextBlockExtensions_TargetUpdated">
         <TextBlock.Text>
          <MultiBinding StringFormat="Files with Extension  {0}">
           <Binding Path="FileExtension"/>
          </MultiBinding>
         </TextBlock.Text>
                        </TextBlock>
                        <Button x:Name="OpenFolderForThisFiles" Click="OnOpenFolderForThisFiles_Click" Margin="5, 3, 5, 3" Width="22" Background="Transparent" BorderBrush="Transparent" BorderThickness="0.5">
                            <Image Source="images\Folder.png" Height="16" Width="20" >
                            </Image>
                        </Button>
                    </StackPanel>
                </HierarchicalDataTemplate>
                <HierarchicalDataTemplate DataType="{x:Type lightvedo:FilePathsStore}">
                    <TextBlock Text="{Binding FilePaths, Mode=OneWay, NotifyOnTargetUpdated=True}" TargetUpdated="OnTreeViewNodeChildren_Update" />
                </HierarchicalDataTemplate>
            </TreeView.Resources>
            <TreeView.RenderTransform>
                <TransformGroup>
                    <ScaleTransform/>
                    <SkewTransform AngleX="-0.083"/>
                    <RotateTransform/>
                    <TranslateTransform X="-0.249"/>
                </TransformGroup>
            </TreeView.RenderTransform>
            <TreeView.BorderBrush>
                <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
                    <GradientStop Color="#FF74591F" Offset="0" />
                    <GradientStop Color="#FF9F7721" Offset="1" />
                    <GradientStop Color="#FFD9B972" Offset="0.49" />
                </LinearGradientBrush>
            </TreeView.BorderBrush>
        </TreeView>

D: Perché i dati da una classe derivata da INotifyPropertyChange non influisce la visualizzazione degli elementi albero. Capisco: L'interfaccia farà INotifyPropertyChange automaticamente TreeViewItems ridisegnate o ho bisogno di effettuare manualmente questa operazione? Attualmente TreeViewItems non aggiornati e PropertyChamged sempre nullo. Una sensazione che non abbonati per l'evento OnPropertyChanged.

È stato utile?

Soluzione

Non è necessario impostare il NotifyOnTargetUpdated.

Invece, assicurarsi di sollevare il PropertyChanged evento (con la proprietà, nome appropriato passato con la PropertyChangedEventArgs passato al gestore) sulla controllante ogni volta che la collezione percorsi viene aggiornato, o che hanno la proprietà di navigazione sia l'implementazione di INotifyCollectionChanged .

Altri suggerimenti

Credo che ho trovato il motivo. Il mio thread in background che analizza costantemente la cartella crea una nuova istanza della classe dati derivati ??da INotifyPropertyChanged, che serve come fonte di TreeViewItems (ItemsSource). Questo principio è stato scelto perché è impossibile prevedere cosa dovrebbe essere fatto con una collezione di file trovati: aggiungere un nuovo elemento, rimuovere uno esistente o modificare uno esistente. Se mai destinato a sostituire ItemsSource trucco con PropertyChange non funziona. Quindi per me l'unica soluzione era quella di chiamare dalla separato (sfondo, la scansione delle cartelle) infilare il metodo () per TreeViewItems Aggiorna.

public delegate void RefreshTreeViewItemsDelegate(); 

Dispatcher.FromThread(_guiThread).BeginInvoke(DispatcherPriority.Render, new RefreshTreeViewItemsDelegate (RefreshTreeItems)) 

// Some code ommited

private void RefreshTreeItems()
{
   _popupWindow.FoundFiles_TreeView.ItemsSource = _treeViewNodesItems;
   _popupWindow.FoundFiles_TreeView.Items.Refresh();
}

L'utilizzo di questa situazione con queste classi ereditate da INotifyPropertyChanged inutili. ItemsControl, si associa a questo si aspetta di classe solo aggiungere, cancellare o modificare gli elementi, ma non sostituisce ItemsSource una nuova istanza della classe di dati.

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