using ExcelLibrary.BinaryFileFormat; using CyberX8_MainPages.ViewModels; using CyberX8_Themes.UserControls; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace CyberX8_MainPages.Views { /// /// RecipeManageView.xaml 的交互逻辑 /// public partial class RecipeManageView : UserControl { public RecipeManageView() { InitializeComponent(); } //private bool _isSelected; //public bool IsSelected //{ // get { return _isSelected; } // set // { // _isSelected = value; // } //} List FileNameList = new List(); List FilePathList = new List(); List checkBoxes = new List(); public bool flag; private void UserControl_Loaded(object sender, RoutedEventArgs e) { (this.DataContext as RecipeManageViewModel).LoadData(""); FileNameList.Clear(); FilePathList.Clear(); } private void CheckBox_Click(object sender, RoutedEventArgs e) { if (sender is CheckBox _checkBox) { // 获取当前 CheckBox 的父节点 TreeViewItem TreeViewItem parentItem = FindVisualParent(_checkBox); if (_checkBox.Content.ToString() == "Engineering" || _checkBox.Content.ToString() == "Production") { bool IsRoot = (bool)_checkBox.DataContext.GetType().GetProperty("IsSelected").GetValue(_checkBox.DataContext); flag = false; // 遍历父节点下的所有子节点 foreach (object item in parentItem.Items) { TreeViewItem childItem = parentItem.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem; if (childItem != null) { // 找到子节点下的 CheckBox CheckBox childCheckBox = FindVisualChild(childItem); if (childCheckBox != null) { // 设置子节点的选中状态与父节点一致 object SelectFilePath = _checkBox.DataContext.GetType().GetProperty("RecipeFullFileName").GetValue(childCheckBox.DataContext); string _selectFilePath = SelectFilePath.ToString(); object SelectFilenName = _checkBox.DataContext.GetType().GetProperty("FileName").GetValue(childCheckBox.DataContext); string _selectFileName = SelectFilenName.ToString(); childCheckBox.IsChecked = _checkBox.IsChecked; if (_checkBox.IsChecked == true) { //FilePathList.Add(_selectFilePath); //FileNameList.Add(_selectFileName); } else { FilePathList.Remove(_selectFilePath ); FileNameList.Remove(_selectFileName); } } } } } else { object SelectFilePath = _checkBox.DataContext.GetType().GetProperty("RecipeFullFileName").GetValue(_checkBox.DataContext); string _selectFilePath = SelectFilePath.ToString(); object SelectFilenName = _checkBox.DataContext.GetType().GetProperty("FileName").GetValue(_checkBox.DataContext); string _selectFileName = SelectFilenName.ToString(); if (flag==false&&FileNameList.Contains(_selectFileName)) { (this.DataContext as RecipeManageViewModel).FilePaths = FilePathList; (this.DataContext as RecipeManageViewModel).FileNames = FileNameList; return; } if (_checkBox.IsChecked == true) { FilePathList.Add(_selectFilePath); FileNameList.Add(_selectFileName); } else { FilePathList.Remove(_selectFilePath); FileNameList.Remove(_selectFileName); } flag = true; } (this.DataContext as RecipeManageViewModel).FilePaths = FilePathList; (this.DataContext as RecipeManageViewModel).FileNames = FileNameList; } } // 递归设置子节点的 CheckBox private void SetChildrenCheckBoxes(CheckBox checkBox, bool isChecked) { TreeViewItem parentItem = FindVisualParent(checkBox); if (parentItem != null) { foreach (object item in parentItem.Items) { TreeViewItem childItem = parentItem.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem; if (childItem != null) { CheckBox childCheckBox = FindVisualChild(childItem); if (childCheckBox != null) { childCheckBox.IsChecked = isChecked; if (childItem.HasItems) { SetChildrenCheckBoxes(childCheckBox, isChecked); } } } } } } // 辅助方法,用于在可视树中查找指定类型的父节点或子节点 private T FindVisualParent(DependencyObject obj) where T : DependencyObject { while (obj != null) { if (obj is T) { return (T)obj; } obj = VisualTreeHelper.GetParent(obj); } return null; } private T FindVisualChild(DependencyObject obj) where T : DependencyObject { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { DependencyObject child = VisualTreeHelper.GetChild(obj, i); if (child != null && child is T) { return (T)child; } else { T childOfChild = FindVisualChild(child); if (childOfChild != null) { return childOfChild; } } } return null; } private void DeleteSelectedAll(object sender, RoutedEventArgs e) { } private void treeView_Selected(object sender, RoutedEventArgs e) { } } }