Cómo actualizarse automáticamente WPF TreeViewItems con valores basados ??en las propiedades de clase .Net?

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

Pregunta

Buenos días. Tengo una clase con los datos derivados de InotifyPropertyChange. Los datos provienen de un subproceso de fondo, que busca archivos con cierta extensión en ciertos lugares. la propiedad pública de los reacciona a una clase onPropertyChange evento mediante la actualización de los datos en un hilo separado. Además, se describen en XAML TreeView, basado en HierarhicalDataTemplates. Cada TextBlock dentro de las plantillas suministra ItemsSource = "{Binding FoundFilePaths, Modo = 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>

Q: ¿Por qué son los datos de una clase derivada de INotifyPropertyChange no afecta a la visualización de los elementos del árbol. Cómo entiendo: La interfaz hará que automáticamente se INotifyPropertyChange TreeViewItems vuelto a trazar o necesito para llevar a cabo esta operación de forma manual? Actualmente TreeViewItems no se actualiza y PropertyChamged siempre nula. Una sensación de que no hay abonados al evento OnPropertyChanged.

¿Fue útil?

Solución

no es necesario ajustar la NotifyOnTargetUpdated.

En su lugar, asegúrese de elevar el PropertyChanged evento (con la propiedad-nombre apropiado pasado con el PropertyChangedEventArgs pasa al controlador) en la entidad matriz cada vez que se actualiza la colección de caminos, o tienen la propiedad de navegación ser una implementación de INotifyCollectionChanged .

Otros consejos

creo que he encontrado la razón. Mi hilo plano que busca constantemente la carpeta crea una nueva instancia de la clase de datos derivados de INotifyPropertyChanged, que sirve como fuente para TreeViewItems (ItemsSource). Este principio se ha elegido porque es imposible predecir lo que debe hacerse con una colección de archivos encontrados: añadir un nuevo elemento, eliminar una existente o editar una ya existente. Si alguna vez la intención de sustituir ItemsSource truco con PropertyChange no funciona. Así que para mí la única solución fue llamar desde el separada (fondo, la exploración de carpetas) hilo () método para TreeViewItems Actualizar.

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

El uso de esta situación con estas clases heredadas de INotifyPropertyChanged inútil. ItemsControl, que se unen a esta Espera clase sólo añadir, borrar o cambiar artículos, pero no reemplaza ItemsSource una nueva instancia de la clase de datos.

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