Wie erhalte ich automatisch WPF TreeViewItems mit Werten basierend auf den Eigenschaften der .NET -Klasse?

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

Frage

Guten Morgen. Ich habe eine Klasse mit Daten, die von InotifyPropertychange abgeleitet wurden. Die Daten stammen aus einem Hintergrund -Thread, der nach Dateien mit einer bestimmten Erweiterung an bestimmten Stellen sucht. Das öffentliche Eigentum der Klasse reagiert auf eine Veranstaltung On -Propertychange, indem Daten in einem separaten Thread aktualisiert werden. Außerdem gibt es in Xaml TreeView, basierend auf HierarhicalDatatemplates. Jeder TextBlock in den vorgeführten Vorlagen von itemsSource = "{Binding foStFilepaths, modus = oneway, benachontargetupdated = 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>

F: Warum werden die Daten aus einer Klasse von InotifyPropertyChange nicht die Anzeige von Baumelementen beeinflussen. Verstehe ich: Die Schnittstelle wird dazu führen, dass InotifyPropertychange automatisch TreeviewItems neu gearbeitet wird oder muss ich diesen Vorgang manuell ausführen? Derzeit nicht aktualisiert und PropertyChamged Immer Null. Ein Gefühl, dass keine Abonnenten des Events on -Propertychanged waren.

War es hilfreich?

Lösung

Sie müssen die nicht festlegen NotifyOnTargetUpdated.

Stellen Sie stattdessen sicher, dass Sie das erhöhen PropertyChanged Ereignis (mit dem entsprechenden Eigenschaftsnamen mit dem verabschiedet mit dem PropertyChangedEventArgs an den Handler übergeben) an der übergeordneten Entität jedes Mal, wenn die Pfadesammlung aktualisiert wird oder die Navigationseigenschaft eine Implementierung von ist INotifyCollectionChanged.

Andere Tipps

Ich glaube, ich habe den Grund gefunden. Mein Hintergrund -Thread, der den Ordner ständig scannt, erstellt eine neue Instanz der von InotifyPropertyChanged abgeleiteten Datenklasse, die als Quelle für TreeViewItems (itemsSource) dient. Dieses Prinzip wird ausgewählt, da es unmöglich ist, vorherzusagen, was mit einer Sammlung von Dateien geschehen ist: Fügen Sie ein neues Element hinzu, entfernen Sie eine vorhandene oder bearbeiten Sie eine vorhanden. Wenn ich jemals beabsichtigt habe, den PowerSource -Trick durch PropertyChange zu ersetzen, funktioniert es nicht. Für mich bestand die einzige Lösung darin, von der separaten Methode für TreeViewItems von der separaten Methode für TreeViewItems aufzurufen.

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

Verwendung dieser Situation mit diesen Klassen, die von InotifyPropertyChanged nutzlos geerbt wurden. ItemsControl, Sie binden an diese Klasse, erwartet nur Hinzufügen, Löschen oder Ändern von Elementen, aber nicht die ElementsSource eine neue Instanz der Datenklasse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top