PropertyChanged使用基类的,各个类不在自己定义

This commit is contained in:
艾竹
2023-04-10 23:08:14 +08:00
parent 429d7b1e24
commit ce2e44fe49
7 changed files with 53 additions and 55 deletions

View File

@@ -53,7 +53,6 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels
{ {
HistoryList = new ObservableCollection<string>(); HistoryList = new ObservableCollection<string>();
} }
this.PropertyChanged += MainWindowViewModel_PropertyChanged;
_service.PropertyChanged += Provider_PropertyChanged; _service.PropertyChanged += Provider_PropertyChanged;
} }
@@ -410,11 +409,6 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels
} }
} }
private void MainWindowViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
}
private void Provider_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) private void Provider_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{ {
if (e.PropertyName == nameof(DrawModeViewModel) if (e.PropertyName == nameof(DrawModeViewModel)

View File

@@ -1308,7 +1308,7 @@
</Fluent:SplitButton.ToolTip> </Fluent:SplitButton.ToolTip>
</Fluent:SplitButton> </Fluent:SplitButton>
<Fluent:Button Header="居中" Size="Middle" Icon="{iconPacks:Material Kind=ImageFilterCenterFocus}" Command="{Binding PageViewModel.DiagramViewModel.CenterCommand}" > <Fluent:Button Header="居中" Size="Middle" Icon="{iconPacks:Material Kind=ImageFilterCenterFocus}" Command="{Binding PageViewModel.DiagramViewModel.CenterMoveCommand}" >
<Fluent:Button.ToolTip> <Fluent:Button.ToolTip>
<Fluent:ScreenTip Title="CenterAlign" <Fluent:ScreenTip Title="CenterAlign"
Text="元素居中" Text="元素居中"

View File

@@ -137,12 +137,20 @@ namespace AIStudio.Wpf.DiagramDesigner
} }
} }
/// <summary>
/// 该拷贝不完整,只适应于工具栏使用
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="s"></param>
/// <returns></returns>
public static T Mapper<T>(T s) where T : SelectableViewModelBase public static T Mapper<T>(T s) where T : SelectableViewModelBase
{ {
if (s == null) if (s == null)
return null; return null;
T d = Activator.CreateInstance(s.GetType()) as T; T d = Activator.CreateInstance(s.GetType()) as T;
d.IsLoaded = false;
var properties = s.GetType().GetProperties(); var properties = s.GetType().GetProperties();
foreach (var propertie in properties) foreach (var propertie in properties)
{ {
@@ -158,6 +166,7 @@ namespace AIStudio.Wpf.DiagramDesigner
d.FontViewModel = CopyHelper.Mapper(s.FontViewModel); d.FontViewModel = CopyHelper.Mapper(s.FontViewModel);
d.ShapeViewModel = CopyHelper.Mapper(s.ShapeViewModel); d.ShapeViewModel = CopyHelper.Mapper(s.ShapeViewModel);
d.LockObjectViewModel = CopyHelper.Mapper<LockObjectViewModel, ILockObjectViewModel>(s.LockObjectViewModel); d.LockObjectViewModel = CopyHelper.Mapper<LockObjectViewModel, ILockObjectViewModel>(s.LockObjectViewModel);
d.IsLoaded = true;
return d; return d;
} }

View File

@@ -18,22 +18,27 @@ namespace AIStudio.Wpf.DiagramDesigner
/// </summary> /// </summary>
public class ConnectionViewModel : SelectableDesignerItemViewModelBase public class ConnectionViewModel : SelectableDesignerItemViewModelBase
{ {
public ConnectionViewModel()
{
}
public ConnectionViewModel(FullyCreatedConnectorInfo sourceConnectorInfo, ConnectorInfoBase sinkConnectorInfo, DrawMode drawMode = DrawMode.ConnectingLineSmooth, RouterMode routerMode = AIStudio.Wpf.DiagramDesigner.RouterMode.RouterNormal) : this(null, sourceConnectorInfo, sinkConnectorInfo, drawMode, routerMode) public ConnectionViewModel(FullyCreatedConnectorInfo sourceConnectorInfo, ConnectorInfoBase sinkConnectorInfo, DrawMode drawMode = DrawMode.ConnectingLineSmooth, RouterMode routerMode = AIStudio.Wpf.DiagramDesigner.RouterMode.RouterNormal) : this(null, sourceConnectorInfo, sinkConnectorInfo, drawMode, routerMode)
{ {
} }
public ConnectionViewModel(IDiagramViewModel root, FullyCreatedConnectorInfo sourceConnectorInfo, ConnectorInfoBase sinkConnectorInfo, DrawMode drawMode = DrawMode.ConnectingLineSmooth, RouterMode routerMode = AIStudio.Wpf.DiagramDesigner.RouterMode.RouterNormal) : base(root) public ConnectionViewModel(IDiagramViewModel root, FullyCreatedConnectorInfo sourceConnectorInfo, ConnectorInfoBase sinkConnectorInfo, DrawMode drawMode = DrawMode.ConnectingLineSmooth, RouterMode routerMode = AIStudio.Wpf.DiagramDesigner.RouterMode.RouterNormal) : base(root)
{ {
PathMode = drawMode.ToString(); _pathMode = drawMode.ToString();
RouterMode = routerMode.ToString(); _routerMode = routerMode.ToString();
Init(root, sourceConnectorInfo, sinkConnectorInfo); Init(root, sourceConnectorInfo, sinkConnectorInfo);
} }
public ConnectionViewModel(IDiagramViewModel root, FullyCreatedConnectorInfo sourceConnectorInfo, FullyCreatedConnectorInfo sinkConnectorInfo, ConnectionItem designer) : base(root, designer) public ConnectionViewModel(IDiagramViewModel root, FullyCreatedConnectorInfo sourceConnectorInfo, FullyCreatedConnectorInfo sinkConnectorInfo, ConnectionItem designer) : base(root, designer)
{ {
PathMode = designer.PathMode; _pathMode = designer.PathMode;
RouterMode = designer.RouterMode; _routerMode = designer.RouterMode;
Init(root, sourceConnectorInfo, sinkConnectorInfo); Init(root, sourceConnectorInfo, sinkConnectorInfo);
} }
@@ -53,34 +58,26 @@ namespace AIStudio.Wpf.DiagramDesigner
protected virtual void Init(IDiagramViewModel root, FullyCreatedConnectorInfo sourceConnectorInfo, ConnectorInfoBase sinkConnectorInfo) protected virtual void Init(IDiagramViewModel root, FullyCreatedConnectorInfo sourceConnectorInfo, ConnectorInfoBase sinkConnectorInfo)
{ {
this.Root = root?? sourceConnectorInfo.Root; IsLoaded = false;
this.Root = root ?? sourceConnectorInfo.Root;
if (sinkConnectorInfo is FullyCreatedConnectorInfo sink && sink.DataItem.ShowArrow == false) if (sinkConnectorInfo is FullyCreatedConnectorInfo sink && sink.DataItem.ShowArrow == false)
{ {
this.ShapeViewModel.SinkMarker = new LinkMarker("", 10, 10, ArrowPathStyle.None, ArrowSizeStyle.Middle); this.ShapeViewModel.SinkMarker = new LinkMarker("", 10, 10, ArrowPathStyle.None, ArrowSizeStyle.Middle);
} }
this.ColorViewModel.PropertyChanged += ConnectorViewModel_PropertyChanged;
this.ShapeViewModel.PropertyChanged += ConnectorViewModel_PropertyChanged;
this.PropertyChanged += ConnectorViewModel_PropertyChanged;
var routetype = TypeHelper.GetType(RouterMode); var routetype = TypeHelper.GetType(RouterMode);
Router = routetype != null ? (System.Activator.CreateInstance(routetype) as IRouter) : new RouterNormal(); Router = routetype != null ? (System.Activator.CreateInstance(routetype) as IRouter) : new RouterNormal();
var pathGeneratortype = TypeHelper.GetType(PathMode); var pathGeneratortype = TypeHelper.GetType(PathMode);
PathGenerator = pathGeneratortype != null ? (System.Activator.CreateInstance(pathGeneratortype) as IPathGenerator) : new ConnectingLineSmooth(); PathGenerator = pathGeneratortype != null ? (System.Activator.CreateInstance(pathGeneratortype) as IPathGenerator) : new ConnectingLineSmooth();
IsLoaded= true;
this.SourceConnectorInfo = sourceConnectorInfo; this.SourceConnectorInfo = sourceConnectorInfo;
this.SinkConnectorInfo = sinkConnectorInfo; this.SinkConnectorInfo = sinkConnectorInfo;
DeleteConnectionCommand = new SimpleCommand(Command_Enable, DeleteConnection); DeleteConnectionCommand = new SimpleCommand(Command_Enable, DeleteConnection);
AddVertexCommand = new SimpleCommand(Command_Enable, AddVertex); AddVertexCommand = new SimpleCommand(Command_Enable, AddVertex);
AddLabelCommand = new SimpleCommand(Command_Enable, para => AddLabel()); AddLabelCommand = new SimpleCommand(Command_Enable, para => AddLabel());
} }
protected override void InitNew()
{
base.InitNew();
}
protected override void LoadDesignerItemViewModel(SelectableItemBase designerbase) protected override void LoadDesignerItemViewModel(SelectableItemBase designerbase)
{ {
base.LoadDesignerItemViewModel(designerbase); base.LoadDesignerItemViewModel(designerbase);
@@ -448,8 +445,10 @@ namespace AIStudio.Wpf.DiagramDesigner
} }
#endregion #endregion
private void ConnectorViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) protected override void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{ {
if (IsLoaded == false) return;
if (sender is ConnectionViewModel) if (sender is ConnectionViewModel)
{ {
switch (e.PropertyName) switch (e.PropertyName)
@@ -464,20 +463,20 @@ namespace AIStudio.Wpf.DiagramDesigner
case nameof(Vertices): case nameof(Vertices):
foreach (var vertice in Vertices) foreach (var vertice in Vertices)
{ {
vertice.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler; vertice.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler;
} }
break; break;
case nameof(Labels): case nameof(Labels):
foreach (var label in Labels) foreach (var label in Labels)
{ {
label.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler; label.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler;
} }
break; break;
case nameof(SourceConnectorInfo): case nameof(SourceConnectorInfo):
if (SourceConnectorInfo != null) if (SourceConnectorInfo != null)
{ {
SourceA = PointHelper.GetPointForConnector(SourceConnectorInfo); SourceA = PointHelper.GetPointForConnector(SourceConnectorInfo);
SourceConnectorInfo.DataItem.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler; SourceConnectorInfo.DataItem.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler;
} }
break; break;
case nameof(SinkConnectorInfo): case nameof(SinkConnectorInfo):
@@ -486,7 +485,7 @@ namespace AIStudio.Wpf.DiagramDesigner
SourceB = SinkConnectorInfo.Position; SourceB = SinkConnectorInfo.Position;
if (IsFullConnection) if (IsFullConnection)
{ {
SinkConnectorInfoFully.DataItem.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler; SinkConnectorInfoFully.DataItem.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler;
} }
} }
break; break;
@@ -572,7 +571,7 @@ namespace AIStudio.Wpf.DiagramDesigner
} }
else if (sender is ColorViewModel) else if (sender is ColorViewModel)
{ {
} }
} }
@@ -595,7 +594,7 @@ namespace AIStudio.Wpf.DiagramDesigner
PathGeneratorResult = PathGenerator.Get(Root, this, route, source.Value, target.Value); PathGeneratorResult = PathGenerator.Get(Root, this, route, source.Value, target.Value);
var startMiddle = new RectangleBase var startMiddle = new RectangleBase
( (
(PathGeneratorResult.SourceMarkerPosition.X + (source.Value.X - Area.Left)) / 2, (PathGeneratorResult.SourceMarkerPosition.X + (source.Value.X - Area.Left)) / 2,
(PathGeneratorResult.SourceMarkerPosition.Y + (source.Value.Y - Area.Top)) / 2, (PathGeneratorResult.SourceMarkerPosition.Y + (source.Value.Y - Area.Top)) / 2,
0, 0,
@@ -820,7 +819,7 @@ namespace AIStudio.Wpf.DiagramDesigner
pointBase = new PointBase(pointBase.X - Area.Left, pointBase.Y - Area.Top); pointBase = new PointBase(pointBase.X - Area.Left, pointBase.Y - Area.Top);
} }
var vertice = new ConnectorVertexModel(this, pointBase); var vertice = new ConnectorVertexModel(this, pointBase);
vertice.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler; vertice.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler;
Vertices.Add(vertice); Vertices.Add(vertice);
UpdatePathGeneratorResult(); UpdatePathGeneratorResult();
} }
@@ -839,7 +838,7 @@ namespace AIStudio.Wpf.DiagramDesigner
public void AddLabel(string text = null, double? distance = null, PointBase? offset = null) public void AddLabel(string text = null, double? distance = null, PointBase? offset = null)
{ {
var label = new ConnectorLabelModel(this, text?.ToString(), distance, offset); var label = new ConnectorLabelModel(this, text?.ToString(), distance, offset);
label.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler; label.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler;
label.IsSelected = true; label.IsSelected = true;
Labels.Add(label); Labels.Add(label);

View File

@@ -129,7 +129,7 @@ namespace AIStudio.Wpf.DiagramDesigner
ShapeViewModel = CopyHelper.Mapper(designerbase.SharpItem); ShapeViewModel = CopyHelper.Mapper(designerbase.SharpItem);
} }
protected bool IsLoaded public bool IsLoaded
{ {
get;set; get;set;
} }
@@ -424,7 +424,7 @@ namespace AIStudio.Wpf.DiagramDesigner
if (IsLoaded == false) { return; } if (IsLoaded == false) { return; }
} }
protected virtual void FontViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) protected void FontViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{ {
if (IsLoaded == false) { return; } if (IsLoaded == false) { return; }
@@ -436,14 +436,14 @@ namespace AIStudio.Wpf.DiagramDesigner
RaisePropertyChanged(sender, e); RaisePropertyChanged(sender, e);
} }
protected virtual void ColorViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) protected void ColorViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{ {
if (IsLoaded == false) { return; } if (IsLoaded == false) { return; }
RaisePropertyChanged(sender, e); RaisePropertyChanged(sender, e);
} }
protected virtual void ShapeViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) protected void ShapeViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{ {
if (IsLoaded == false) { return; } if (IsLoaded == false) { return; }

View File

@@ -45,8 +45,6 @@ namespace AIStudio.Wpf.DiagramDesigner
{ {
base.Init(root, initNew); base.Init(root, initNew);
this.PropertyChanged += ImageItemViewModel_PropertyChanged;
BuildMenuOptions(); BuildMenuOptions();
} }
@@ -66,8 +64,10 @@ namespace AIStudio.Wpf.DiagramDesigner
} }
} }
private void ImageItemViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) protected override void Item_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{ {
if (this.IsLoaded == false) return;
if (e.PropertyName == nameof(ItemWidth) || e.PropertyName == nameof(ItemHeight) || e.PropertyName == nameof(ResizeMargin) || e.PropertyName == nameof(ClipMode)) if (e.PropertyName == nameof(ItemWidth) || e.PropertyName == nameof(ItemHeight) || e.PropertyName == nameof(ResizeMargin) || e.PropertyName == nameof(ClipMode))
{ {
RaisePropertyChanged(nameof(Object)); RaisePropertyChanged(nameof(Object));

View File

@@ -99,12 +99,11 @@ namespace AIStudio.Wpf.Mind.ViewModels
public void InitLayout(bool initAppearance) public void InitLayout(bool initAppearance)
{ {
IsLoaded = false;
var layout = TypeHelper.GetType(this.MindType.ToString() + "Layout"); var layout = TypeHelper.GetType(this.MindType.ToString() + "Layout");
MindLayout = layout != null ? (System.Activator.CreateInstance(layout) as IMindLayout) : new MindLayout(); MindLayout = layout != null ? (System.Activator.CreateInstance(layout) as IMindLayout) : new MindLayout();
this.PropertyChanged -= this.Item_PropertyChanged;
MindLayout.Appearance(this, MindTheme, initAppearance); MindLayout.Appearance(this, MindTheme, initAppearance);
this.PropertyChanged += this.Item_PropertyChanged; IsLoaded = true;
} }
public void InitConnectionLayout() public void InitConnectionLayout()
@@ -559,7 +558,7 @@ namespace AIStudio.Wpf.Mind.ViewModels
public void RemoveFrom() public void RemoveFrom()
{ {
this.PropertyChanged -= Item_PropertyChanged; this.IsLoaded = false;
if (this.ParentNode != null) if (this.ParentNode != null)
{ {
this.ParentNode.Children.Remove(this); this.ParentNode.Children.Remove(this);
@@ -572,8 +571,10 @@ namespace AIStudio.Wpf.Mind.ViewModels
#endregion #endregion
#region #region
private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e) protected override void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{ {
if (IsLoaded == false) return;
if (GetLevel0Node()?.LayoutUpdating == true) return; if (GetLevel0Node()?.LayoutUpdating == true) return;
Interlocked.Increment(ref Root.DoCommandManager.BeginDo); Interlocked.Increment(ref Root.DoCommandManager.BeginDo);
@@ -600,7 +601,7 @@ namespace AIStudio.Wpf.Mind.ViewModels
case nameof(ItemWidth): case nameof(ItemWidth):
case nameof(ItemHeight): case nameof(ItemHeight):
{ {
UpdatedLayout(); UpdatedLayout();
break; break;
} }
@@ -617,17 +618,12 @@ namespace AIStudio.Wpf.Mind.ViewModels
SetItemWidthHeight(); SetItemWidthHeight();
break; break;
} }
case nameof(FontViewModel.FontSize):
SetItemWidthHeight();
break;
} }
Interlocked.Decrement(ref Root.DoCommandManager.BeginDo); Interlocked.Decrement(ref Root.DoCommandManager.BeginDo);
} }
protected override void FontViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(FontViewModel.FontSize))
{
SetItemWidthHeight();
}
}
#endregion #endregion
#region #region