C# 折叠树状视图时,选择项不会得到维护

C# 折叠树状视图时,选择项不会得到维护,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个带有父节点的树视图,其中包含子项。我正在选择子节点,在折叠相应的父节点时,选择不会得到维护 XAML: 代码隐藏: public partial class MainWindow : Window { public static List<Person> persons = new List<Person>(); public MainWindow() { InitializeComponent();

我有一个带有父节点的树视图,其中包含子项。我正在选择子节点,在折叠相应的父节点时,选择不会得到维护

XAML:


代码隐藏:

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");
            }
        }
    }
}
公共部分类主窗口:窗口
{
公共静态列表人员=新列表();
公共主窗口()
{
初始化组件();
Person person1=new Person(){Name=“John Doe”,uniqueName=“1”,Age=42};
person1.Children.Add(newperson(){Name=“Sammy Doe”,uniqueName=“2”,parentUniqueName=“1”,Age=13});
Person person2=新人(){Name=“Jane Doe”,uniqueName=“3”,年龄=39};
person2.Children.Add(newperson(){Name=“Jenny Moe\\”,uniqueName=“4”,parentUniqueName=“3”,Age=17});
person2.Children.Add(newperson(){Name=“Jenny Moe”,uniqueName=“5”,parentUniqueName=“3”,Age=17});
Person person3=新人(){Name=“Becky Toe”,uniqueName=“6”,年龄=25};
person3.Children.Add(newperson(){Name=“Jenny Moe”,uniqueName=“7”,parentUniqueName=“6”,Age=17});
人员。添加(人员1);
人员。添加(人员2);
人员。添加(人员3);
trvPersons.itemsource=人;
}
私有无效trvPersons\u SelectedItemChanged(对象发送方,RoutedPropertyChangedEventArgs e)
{
}
公共类人员:INotifyPropertyChanged
{
公共列表子项{get;set;}
公共字符串uniqueName{get;set;}
公共字符串parentUniqueName{get;set;}
公众人士()
{
this.Children=新列表();
}
公共字符串名称{get;set;}
公共整数{get;set;}
私人住宅被检查;
公共事件属性更改事件处理程序属性更改;
公共void OnPropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
公共场所被检查
{
获取{返回this.isChecked;}
设置
{
this.isChecked=值;
if(value&!string.IsNullOrEmpty(this.parentUniqueName))
{
persons.ForEach(i=>i.IsChecked=false);
var p=MainWindow.persons.FirstOrDefault(i=>i.uniqueName==this.parentUniqueName);
如果(p!=null)
{
p、 IsChecked=true;
}
}
财产变更(“已检查”);
}
}
}
}

基本上在WPF树状视图中,如果单击父节点进行折叠,所选项目将更改为父节点

提供您的检查代码i此,到目前为止,只有我们可以检查问题。如果没有代码,很难判断问题出在哪里。找到示例代码-是否有其他方法来维护选择?
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");
            }
        }
    }
}