【问题标题】:Class design issue in C#. Pager for controlC# 中的类设计问题。控制寻呼机
【发布时间】:2011-09-12 03:09:33
【问题描述】:

我已经实现了一个自定义控件,它将一些自定义类作为项目并绘制它们。我想实现一个分页类以翻页,但可以自定义。到目前为止,我已经定义了一个接口。

public interface IPager
{
    void NextPage(....);
    int CurrentPage(.....);
    void PreviousPage(...);
    int PageCount(.....);
}

我的自定义控件采用了 IPager 的实现。问题是实例不是从控制范围内创建的。这不是问题,但如果我添加像 currentPage 这样的实例参数而不必计算复杂的东西。问题是 IPager 实现在自定义控件对象之外,但应该只在一个控件中使用。

除了拥有 IPager 的无状态实现并将实例值保存在自定义控件中之外,我没有其他解决方案。 扩展自定义控件类也不是解决方案,因为寻呼机可能会动态变化...
还有其他解决方案吗?

【问题讨论】:

    标签: c# pager


    【解决方案1】:

    您的自定义控件应该只显示一个页面,而不关心维护寻呼机状态。在 MVC 用语中,它是一个视图。您将分页和维护状态的逻辑与实际显示页面的过程分开。做这样的事情:

    interface IPageView {
        IPager Pager {get;set;}
        void ShowPage(PageData pageData);
    }
    // This is your custom control:
    class PageViewControl : Control, IPageView {
        public IPager Pager { get; set; }
        public void ShowPage(PageData pageData) {
            // show the page data
        }
    }
    // You've already defined the IPager interface:
    interface IPager {
        ... 
    }
    class Pager : IPager {
        IPageView _view;
        public void SetView(IPageView view) { _view = view; }
        ... // state members, etc
        public void NextPage() {
            // update state, find page data
            _view.ShowPage(pageData);
        }
    }
    

    然后实例化它,比如包含表单的构造函数:

    var pager = new Pager(...);
    pager.SetView(pageViewControl1);
    pageViewControl1.Pager = pager;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 2011-05-07
      • 2011-06-13
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多