2017-08-17 2 views
0

J'essaie de lier plusieurs TreeViews à la même ItemSource qui contient TreeViewItems. Chaque fois que je fais cela, le dernier à charger est le seul qui affiche les éléments. (Donc, si j'ai trois arborescences déclaré dans un ordre spécifique, la dernière déclarée sera le seul à afficher les éléments.)Liaison de plusieurs TreeViews à la même ItemSource

Ce projet WPF exemple avec les paramètres par défaut j'ai créé pour montrer:

XAML:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <TreeView x:Name="TreeOne" ItemsSource="{Binding TreeItems}" HorizontalAlignment="Left" Height="300" Margin="10,10,0,0" VerticalAlignment="Top" Width="238"/> 
     <TreeView x:Name="TreeTwo" ItemsSource="{Binding TreeItems}" HorizontalAlignment="Left" Height="300" Margin="10,10,0,0" VerticalAlignment="Top" Width="239" Grid.Column="1"/> 
    </Grid> 
</Window> 

code Derrière: (j'utilise MVVM dans le vrai projet, mais cela a le même bug)

using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Windows; 
using System.Windows.Controls; 

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      TreeItems = new ObservableCollection<TreeViewItem>() { new TreeViewItem() { Header = "First item" } }; 
      InitializeComponent(); 
     } 

     public ObservableCollection<TreeViewItem> TreeItems { get; set; } 
    } 
} 

picture of the output of the above code

Si je commente le deuxième arbre, le premier s'affichera correctement.

Répondre

2

TreeViewItem s sont des contrôles et ne peuvent pas être affichés simultanément dans plusieurs arbres visuels (pas la même chose que TreeView!). Pour résoudre le problème, utilisez la collection de chaînes (new ObservableCollection<string> { "First item" };). Dans le cas où vous avez une fonction complexe de données objectsuse configurons leur visualisation, par exemple:

TreeItems = new ObservableCollection<DateTime>() 
{ 
    new DateTime(2017, 1, 1), 
    new DateTime(2017, 12, 31) 
}; 

XAML

<Window.Resources> 

    <DataTemplate x:Key="DateItem"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding Path=Year}"/> 
      <Border Background="Green" Width="2" Height="2"/> 
      <TextBlock Text="{Binding Path=Month}"/> 
      <Border Background="Green" Width="2" Height="2"/> 
      <TextBlock Text="{Binding Path=Day}"/> 
     </StackPanel>    
    </DataTemplate> 

</Window.Resources> 

<TreeView x:Name="TreeOne" ItemTemplate="{StaticResource DateItem}"/> 
<TreeView x:Name="TreeTwo" ItemTemplate="{StaticResource DateItem}"/> 
+0

Merci. C'est certainement la bonne réponse. Malheureusement, mon objet de données complexe principal étend un contrôle qui, rétrospectivement, était une mauvaise décision, mais il est profondément ancré maintenant. Je pense que je vais devoir corriger cela rapidement en dupliquant le code pour qu'il applique les mêmes modifications à chaque arbre avec une source de données séparée. :( – autogenerated7331