我已经实现了一个自定义控件,它将一些自定义类作为项目并绘制它们。我想实现一个分页类,以便翻页,但是可以自定义。到目前为止我已经定义了一个接口。
public interface IPager
{
void NextPage(....);
int CurrentPage(.....);
void PreviousPage(...);
int PageCount(.....);
}
我的自定义控件采用IPager的实现。问题是实例不是从控件内创建的。这不是问题,但如果我添加像currentPage这样的实例参数而不必计算复杂的东西..问题是IPager实现在自定义控件对象之外但应该只在一个控件中使用..
除了拥有无状态的IPager实现并在自定义控件中保留实例值之外,我无法解决其他问题。 扩展自定义控件类也不是解决方案,因为寻呼机可能会动态变化... 还有其他解决办法吗?
答案 0 :(得分: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;