using Avalonia.Controls; using Avalonia.Media; using CommunityToolkit.Mvvm.ComponentModel; using Serein.Library; using Serein.Workbench.Avalonia.Api; using Serein.Workbench.Avalonia.Custom.Node.Views; using Serein.Workbench.Avalonia.Custom.Views; using Serein.Workbench.Avalonia.ViewModels; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Serein.Workbench.Avalonia.Custom.Node.ViewModels { /// /// 节点ViewModel基类 /// internal abstract class NodeViewModelBase : ViewModelBase { internal abstract NodeModelBase NodeModelBase { get; set; } private Canvas NodeCanvas; /// /// 如果该节点放置在了某个容器节点,就会记录这个容器节点 /// private INodeContainerControl NodeContainerControl { get; } public NodeModelBase NodeModel { get; set; } /// /// 记录与该节点控件有关的所有连接 /// private readonly List connectionControls = new List(); //public NodeControlViewModelBase ViewModel { get; set; } public void SetNodeModel(NodeModelBase nodeModel) => this.NodeModel = nodeModel; /// /// 添加与该节点有关的连接后,记录下来 /// /// public void AddCnnection(NodeConnectionLineView connection) { connectionControls.Add(connection); } /// /// 删除了连接之后,还需要从节点中的记录移除 /// /// public void RemoveConnection(NodeConnectionLineView connection) { connectionControls.Remove(connection); //connection.Remote(); } /// /// 删除所有连接 /// public void RemoveAllConection() { foreach (var connection in this.connectionControls) { //connection.Remote(); } } /// /// 更新与该节点有关的数据 /// public void UpdateLocationConnections() { foreach (var connection in this.connectionControls) { //connection.RefreshLine(); // 主动更新连线位置 } } /// /// 设置绑定: /// Canvas.X and Y : 画布位置 /// public void SetBinding() { /* // 绑定 Canvas.Left Binding leftBinding = new Binding("X") { Source = ViewModel.NodeModel.Position, // 如果 X 属性在当前 DataContext 中 Mode = BindingMode.TwoWay }; BindingOperations.Apply(this, Canvas.LeftProperty, leftBinding); // 绑定 Canvas.Top Binding topBinding = new Binding("Y") { Source = ViewModel.NodeModel.Position, // 如果 Y 属性在当前 DataContext 中 Mode = BindingMode.TwoWay }; BindingOperations.SetBinding(this, Canvas.TopProperty, topBinding);*/ } /// /// 穿透视觉树获取指定类型的第一个元素 /// /// /// /// //protected T FindVisualChild(DependencyObject parent) where T : DependencyObject //{ // for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) // { // var child = VisualTreeHelper.GetChild(parent, i); // if (child is T typedChild) // { // return typedChild; // } // var childOfChild = FindVisualChild(child); // if (childOfChild != null) // { // return childOfChild; // } // } // return null; //} } }