问题描述
我正在制作一个 UML 应用程序。您可以选择/取消选择任何类型,这会更改类型上的 IsSelected 属性。项目对此事件做出反应并更改 CurrentSelected 属性。
问题是如果当前值不为空,CurrentlySelected 属性将取消选择当前值。这会一遍又一遍地触发相同的事件序列,因为 IsSelected 状态已更改。
项目模型 | 项目控制器 | 项目视图 |
---|---|---|
Type CurrentlySelectedType |
AddClass(Project model) |
|
Action<Type> OnCurrentlySelectedChanged |
然后是类结构:
类模型 | 类控制器 | 类视图 |
---|---|---|
bool IsSelected |
View.Clicked += () => Model.IsSelected = !Model.IsSelected |
Action Clicked |
Action Selected |
||
Action deselected |
Class.cs
public bool IsSelected
{
get => _isSelected;
set
{
_isSelected = value;
if (_isSelected)
OnSelected?.Invoke();
else
Ondeselected?.Invoke();
}
}
ProjectController.cs
private void AddClass(Project projectModel)
{
// Model
var classModel = new Class();
projectModel.AddType(classModel);
// View
var classViewInstance = View.AddClassView(classModel) as GUI_Element_Type_Class;
// Controller
var classController = new ClassController(classModel,classViewInstance);
// Causes crash when setting CurrentlySelectedType to null. This code and '_currentlySelectedType.IsSelected = false' in Project causes crash loop
classModel.OnSelected += () => Model.CurrentlySelectedType = classModel;
classModel.Ondeselected += () => Model.CurrentlySelectedType = null;
}
Project.cs
public Type CurrentlySelectedType
{
get => _currentlySelectedType;
set
{
if (value == null)
{
// deselect prevIoUs
if (_currentlySelectedType != null)
_currentlySelectedType.IsSelected = false;
// Select null
_currentlySelectedType = value;
OnCurrentlySelectedChanged?.Invoke(value);
}
else if (value != _currentlySelectedType)
{
// deselect prevIoUs
if (_currentlySelectedType != null)
_currentlySelectedType.IsSelected = false;
// Select new
_currentlySelectedType = value;
OnCurrentlySelectedChanged?.Invoke(value);
}
}
}
您可能会看到更改 Class.IsSelected 如何使 ProjectController 设置 Project.CurrentlySelectedType,后者发送 OnCurrentlySelectedChanged 事件,然后将 Class.IsSelected 设置为某些内容,从而创建无限循环。
Class.IsSelected > OnSelected > ProjectController.AddClass > ProjectModel.CurrentlySelectedType 分配(改变 Class.IsSelected)> 崩溃
我认为问题在于 ProjectController.AddClass 或 CurrentSelectedType 中的侦听器在错误的时间取消选择,但我不知道对被选择/取消选择的类还有什么反应。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)