如何解决MVC 选择/取消选择与无限循环问题
我正在制作一个 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 举报,一经查实,本站将立刻删除。