微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MVC 选择/取消选择与无限循环问题

如何解决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 举报,一经查实,本站将立刻删除。