2017-02-23 20 views
0

子ノードを含む親ノードを持つツリービューが表示されました。私は子ノードを選択しており、それぞれの親ノードを折りたたむ際には選択が維持されません。ツリービューを折りたたむと、選択項目が維持されません。

XAML:

<Grid> 
    <TreeView Name="trvPersons" SelectedItemChanged="trvPersons_SelectedItemChanged"> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="{Binding Name}" Margin="0,0,4,0" x:Name="txt"/> 
       </StackPanel> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
     <TreeView.ItemContainerStyle> 
      <Style TargetType="TreeViewItem"> 
       <Setter Property="IsSelected" Value="{Binding IsChecked}" /> 
      </Style> 
     </TreeView.ItemContainerStyle> 
    </TreeView> 
</Grid> 

コードの後ろ:

あなたが崩壊の親ノードをクリックすると、選択した項目は、親ノードに変更され、基本的にWPFのツリービューで
public partial class MainWindow : Window 
{ 
    public static List<Person> persons = new List<Person>(); 
    public MainWindow() 
    { 
     InitializeComponent(); 

     Person person1 = new Person() { Name = "John Doe", uniqueName="1", Age = 42 };   
     person1.Children.Add(new Person() { Name = "Sammy Doe", uniqueName = "2", parentUniqueName = "1", Age = 13 }); 
     Person person2 = new Person() { Name = "Jane Doe", uniqueName = "3", Age = 39 }; 
     person2.Children.Add(new Person() { Name = "Jenny Moe\\", uniqueName = "4", parentUniqueName = "3", Age = 17 }); 
     person2.Children.Add(new Person() { Name = "Jenny Moe", uniqueName = "5", parentUniqueName = "3", Age = 17 }); 
     Person person3 = new Person() { Name = "Becky Toe", uniqueName = "6", Age = 25 }; 
     person3.Children.Add(new Person() { Name = "Jenny Moe", uniqueName = "7", parentUniqueName = "6", Age = 17 }); 
     persons.Add(person1); 
     persons.Add(person2); 
     persons.Add(person3);  

     trvPersons.ItemsSource = persons; 
    } 

    private void trvPersons_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
    } 

    public class Person : INotifyPropertyChanged 
    { 
     public List<Person> Children { get; set; } 
     public string uniqueName { get; set; } 
     public string parentUniqueName { get; set; } 

     public Person() 
     { 
      this.Children = new List<Person>(); 
     } 

     public string Name { get; set; } 
     public int Age { get; set; } 
     private bool isChecked; 

     public event PropertyChangedEventHandler PropertyChanged; 

     public void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     public bool IsChecked 
     { 
      get { return this.isChecked; } 
      set 
      { 
       this.isChecked = value; 
       if (value && !string.IsNullOrEmpty(this.parentUniqueName)) 
       { 
        persons.ForEach(i => i.IsChecked = false); 
        var p = MainWindow.persons.FirstOrDefault(i => i.uniqueName == this.parentUniqueName); 
        if (p != null) 
        { 
         p.IsChecked = true; 
        } 
       } 
       OnPropertyChanged("IsChecked"); 
      } 
     } 
    } 
} 
+0

が提供ウルチェックされたコード私は、これまでは問題を確認することしかできません –

+0

コードなしで問題が何であるかを知るのは難しいです。 – RasmusW

+0

サンプルコードを見つける - Doe – Doe

答えて

0

+0

選択を維持するための方法はありますか? – Doe