即将大削TreeList
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
@@ -18,12 +19,19 @@ using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
using System.Windows.Threading;
|
||||
using System.Xml.Linq;
|
||||
using static System.Net.Mime.MediaTypeNames;
|
||||
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||
|
||||
namespace Ramitta
|
||||
{
|
||||
public partial class winTreeList : UserControl
|
||||
public partial class winTreeList : UserControl, INotifyPropertyChanged
|
||||
{
|
||||
public event PropertyChangedEventHandler? PropertyChanged;
|
||||
protected void OnPropertyChanged(string propertyName)
|
||||
{
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
|
||||
public winTreeList()
|
||||
{
|
||||
InitializeComponent();
|
||||
@@ -53,32 +61,89 @@ namespace Ramitta
|
||||
#endregion
|
||||
|
||||
#region 公共方法
|
||||
|
||||
#region 增
|
||||
public LabelTreeNode AddLabelNode(string text, TreeNode? parent = null)
|
||||
{
|
||||
var node = new LabelTreeNode { Text = text };
|
||||
AddNode(node, parent);
|
||||
return node;
|
||||
}
|
||||
public CheckboxTreeNode AddCheckboxNode(string text, string? tag=null, bool isChecked = false, TreeNode? parent = null)
|
||||
{
|
||||
var node = new CheckboxTreeNode {
|
||||
Text = text,
|
||||
IsChecked = isChecked,
|
||||
Tag = tag ?? text };
|
||||
AddNode(node, parent);
|
||||
return node;
|
||||
}
|
||||
public ComboboxTreeNode AddComboboxNode(string text, string[]? item=null, TreeNode? parent = null)
|
||||
{
|
||||
var node = new ComboboxTreeNode {
|
||||
Text = text,
|
||||
ComboBoxItems = new ObservableCollection<string>(item ?? []),
|
||||
var label = new Label()
|
||||
{
|
||||
Content = text
|
||||
};
|
||||
|
||||
var node = new LabelTreeNode
|
||||
{
|
||||
Text = text,
|
||||
obj = label
|
||||
};
|
||||
|
||||
AddNode(node, parent);
|
||||
return node;
|
||||
}
|
||||
|
||||
public CheckboxTreeNode AddCheckboxNode(string text, string? tag = null, bool isChecked = false, TreeNode? parent = null)
|
||||
{
|
||||
var checkbox = new CheckBox()
|
||||
{
|
||||
IsChecked = isChecked,
|
||||
Content = text,
|
||||
Tag = tag ?? text,
|
||||
ToolTip = tag ?? text,
|
||||
VerticalAlignment = VerticalAlignment.Center
|
||||
};
|
||||
|
||||
// 处理选中状态变化
|
||||
checkbox.Checked += (s, e) => OnCheckboxStateChanged(checkbox, true);
|
||||
checkbox.Unchecked += (s, e) => OnCheckboxStateChanged(checkbox, false);
|
||||
|
||||
var node = new CheckboxTreeNode
|
||||
{
|
||||
Text = text,
|
||||
obj = checkbox
|
||||
};
|
||||
|
||||
AddNode(node, parent);
|
||||
return node;
|
||||
}
|
||||
|
||||
public ComboboxTreeNode AddComboboxNode(string text, List<string>? items = null, TreeNode? parent = null)
|
||||
{
|
||||
var combobox = new ComboBox()
|
||||
{
|
||||
SelectedIndex = 0,
|
||||
VerticalAlignment = VerticalAlignment.Center,
|
||||
MinWidth = 100
|
||||
};
|
||||
|
||||
// 处理选择改变事件
|
||||
combobox.SelectionChanged += (s, e) =>
|
||||
{
|
||||
if (combobox.SelectedItem is string selected)
|
||||
{
|
||||
OnComboboxSelectionChanged(combobox, selected);
|
||||
}
|
||||
};
|
||||
|
||||
var node = new ComboboxTreeNode
|
||||
{
|
||||
Text = text,
|
||||
obj = combobox
|
||||
};
|
||||
|
||||
AddNode(node, parent);
|
||||
return node;
|
||||
}
|
||||
|
||||
// 可选:添加事件处理方法
|
||||
private void OnCheckboxStateChanged(CheckBox checkbox, bool isChecked)
|
||||
{
|
||||
// 这里可以处理复选框状态变化逻辑
|
||||
Debug.WriteLine($"Checkbox '{checkbox.Tag}' changed to: {isChecked}");
|
||||
}
|
||||
|
||||
private void OnComboboxSelectionChanged(ComboBox combobox, string selectedValue)
|
||||
{
|
||||
// 这里可以处理组合框选择变化逻辑
|
||||
Debug.WriteLine($"Combobox selection changed to: {selectedValue}");
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 查(这里面的函数下一个版本全被杀)
|
||||
@@ -92,9 +157,9 @@ namespace Ramitta
|
||||
var tags = new List<string>();
|
||||
foreach (var node in nodes)
|
||||
{
|
||||
if (node is CheckboxTreeNode checkboxNode && checkboxNode.IsChecked)
|
||||
if (node is CheckboxTreeNode checkboxNode && (checkboxNode.obj.IsChecked ?? false))
|
||||
{
|
||||
tags.Add(checkboxNode.Tag);
|
||||
tags.Add(checkboxNode.obj.Tag.ToString());
|
||||
}
|
||||
|
||||
// 递归查找子节点
|
||||
@@ -113,9 +178,9 @@ namespace Ramitta
|
||||
var tags = new List<string>();
|
||||
foreach (var node in nodes)
|
||||
{
|
||||
if (node is CheckboxTreeNode checkboxNode && checkboxNode.IsChecked != true)
|
||||
if (node is CheckboxTreeNode checkboxNode && checkboxNode.obj.IsChecked != true)
|
||||
{
|
||||
tags.Add(checkboxNode.Tag);
|
||||
tags.Add(checkboxNode.obj.Tag.ToString());
|
||||
}
|
||||
|
||||
// 递归查找子节点
|
||||
@@ -124,34 +189,6 @@ namespace Ramitta
|
||||
return tags;
|
||||
}
|
||||
|
||||
public List<CheckboxTreeNode> GetNoCheckBoxNodes(bool check)
|
||||
{
|
||||
return GetAllNodes().OfType<CheckboxTreeNode>().
|
||||
Where(n =>
|
||||
(check ? n.IsChecked : !n.IsChecked)
|
||||
).ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定Label节点下所有被勾选的Checkbox节点的Tag列表
|
||||
/// </summary>
|
||||
/// <param name="labelNodeName">Label节点的名称</param>
|
||||
/// <returns>被勾选Checkbox节点的Tag列表</returns>
|
||||
public List<string> GetCheckboxTagsUnderLabelNode(string labelNodeName)
|
||||
{
|
||||
var tags = new List<string>();
|
||||
|
||||
List<LabelTreeNode> getTreeNode = FindTreeNodes<LabelTreeNode>(Nodes, labelNodeName);
|
||||
|
||||
var labelNode = getTreeNode.Count != 0 ? getTreeNode[0] : null;
|
||||
|
||||
if (labelNode != null)
|
||||
{
|
||||
tags.AddRange(GetCheckedCheckboxTags(labelNode.Children));
|
||||
}
|
||||
return tags;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 查
|
||||
@@ -211,6 +248,8 @@ namespace Ramitta
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
// 改这个玩意
|
||||
public xControl? Find<xTreeNode, xControl>(IEnumerable<TreeNode>? nodes, string key)
|
||||
where xTreeNode : class
|
||||
@@ -281,6 +320,10 @@ namespace Ramitta
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public JObject JsonPrint(IEnumerable<TreeNode>? nodes, int loop = 0)
|
||||
{
|
||||
// 如果传入的节点为空,使用默认的 Nodes 集合
|
||||
@@ -298,14 +341,14 @@ namespace Ramitta
|
||||
|
||||
if (node.GetType() == typeof(CheckboxTreeNode))
|
||||
{
|
||||
nodeObject["IsChecked"] = (node as CheckboxTreeNode)?.IsChecked.ToString();
|
||||
nodeObject["IsChecked"] = (node as CheckboxTreeNode)?.obj.IsChecked.ToString();
|
||||
}
|
||||
|
||||
|
||||
if (node.GetType() == typeof(ComboboxTreeNode))
|
||||
{
|
||||
var target = node as ComboboxTreeNode;
|
||||
nodeObject["SelectedItem"] = target?.SelectedItem.ToString();
|
||||
nodeObject["SelectedItem"] = target?.obj.SelectedItem.ToString();
|
||||
}
|
||||
|
||||
|
||||
@@ -416,15 +459,48 @@ namespace Ramitta
|
||||
}
|
||||
|
||||
#region 数据模型
|
||||
public abstract class TreeNode
|
||||
public abstract class TreeNode : INotifyPropertyChanged
|
||||
{
|
||||
public TreeNode()
|
||||
private string _text;
|
||||
private ObservableCollection<TreeNode> _children;
|
||||
|
||||
public event PropertyChangedEventHandler? PropertyChanged;
|
||||
|
||||
protected void OnPropertyChanged(string propertyName)
|
||||
{
|
||||
Children = new ObservableCollection<TreeNode>();
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
|
||||
public string Text { get; set; }
|
||||
public ObservableCollection<TreeNode> Children { get; set; }
|
||||
public TreeNode()
|
||||
{
|
||||
_children = new ObservableCollection<TreeNode>();
|
||||
}
|
||||
|
||||
public string Text
|
||||
{
|
||||
get => _text;
|
||||
set
|
||||
{
|
||||
if (_text != value)
|
||||
{
|
||||
_text = value;
|
||||
OnPropertyChanged(nameof(Text));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public ObservableCollection<TreeNode> Children
|
||||
{
|
||||
get => _children;
|
||||
set
|
||||
{
|
||||
if (_children != value)
|
||||
{
|
||||
_children = value;
|
||||
OnPropertyChanged(nameof(Children));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -432,15 +508,41 @@ namespace Ramitta
|
||||
/// </summary>
|
||||
public class LabelTreeNode : TreeNode
|
||||
{
|
||||
private Label _obj;
|
||||
|
||||
public Label obj
|
||||
{
|
||||
get => _obj;
|
||||
set
|
||||
{
|
||||
if (_obj != value)
|
||||
{
|
||||
_obj = value;
|
||||
OnPropertyChanged(nameof(obj));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Label类型的树节点
|
||||
/// Combobox类型的树节点
|
||||
/// </summary>
|
||||
public class ComboboxTreeNode : TreeNode
|
||||
{
|
||||
public string SelectedItem { get; set; }
|
||||
public ObservableCollection<string> ComboBoxItems { get; set; } = new ObservableCollection<string>();
|
||||
private ComboBox _obj;
|
||||
|
||||
public ComboBox obj
|
||||
{
|
||||
get => _obj;
|
||||
set
|
||||
{
|
||||
if (_obj != value)
|
||||
{
|
||||
_obj = value;
|
||||
OnPropertyChanged(nameof(obj));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -448,20 +550,20 @@ namespace Ramitta
|
||||
/// </summary>
|
||||
public class CheckboxTreeNode : TreeNode
|
||||
{
|
||||
public string Tag { get; set; }
|
||||
private bool _isChecked;
|
||||
public bool IsChecked
|
||||
private CheckBox _obj;
|
||||
|
||||
public CheckBox obj
|
||||
{
|
||||
get { return _isChecked; }
|
||||
get => _obj;
|
||||
set
|
||||
{
|
||||
if (_isChecked != value)
|
||||
if (_obj != value)
|
||||
{
|
||||
_isChecked = value;
|
||||
_obj = value;
|
||||
OnPropertyChanged(nameof(obj));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
Reference in New Issue
Block a user