如何解决创建自定义WPF控件时应使用哪种方法?
| 我将重做一个旧的WinForms应用程序作为WPF应用程序。该应用程序的核心是自定义的“网格”组件。我想作为WPF组件的最佳方法的一些想法。 该应用程序显示不同国家/地区的数据网格。网格的每个单元格根据该国家/地区的可用数据显示不同的信息(例如图形,图像)。 我有一个域模型程序集,我想保持它的干净—以最大程度地重用。结构如下: 表 大洲 国别 部门 数据[国家/地区] 网格在左下方显示国家/地区,在顶部显示扇区。 在当前应用程序中,网格组件具有(POCO)表属性和Refresh()方法以手动重绘它。因此,如果表已更新,则网格组件的父级将刷新它。网格组件还具有许多事件,如果单击了大洲,国家或地区,则会触发这些事件-以便父级可以通过弹出菜单等进行响应。 这一切都很好。 但是,我想知道这是否是用于WPF应用程序的正确模型。在WPF的许多示例中,它们都支持数据绑定等。但是,从简单的示例中尚不清楚我如何将复杂的对象绑定到我的组件上,或者是否值得。 此外,WinForms组件是完全自定义绘制的-没有使用任何子控件(例如Label)。使用WPF用户控件并从GridLayout和许多Label,Shape等控件构建表会更好吗?实际上,它们可能是网格中的20行20列,并且用户在使用该应用程序时会定期删除并添加国家/地区(行/列)。 我的近期目标是确保我的设计在WPF生态系统中发挥良好的作用,但是我的第二个目标是学习如何以WPFy方式进行操作-这是我的第一个WPF应用程序。我非常擅长构建通用的WPF应用程序-只是自定义控件的内容仍然有些模糊(即使在阅读了一下之后)。 任何见解/指导将不胜感激。解决方法
正如乔什·史密斯(Josh Smith)概述的那样,您肯定想采用MVVM方法。实际上,这意味着您的自定义网格组件将包含在其自己的视图中。支持该视图的是ViewModel,您将在其中定义包含数据的对象的ObservableCollection。这些对象可能来自您的模型。该交互如下所示:
楷模:
public class TableData
{
public string Country { get; set; }
public string Continent { get; set; }
public object Sector { get; set; }
}
public class TableManager : ITableManager
{
public Collection<TableData> Rows;
public void GetData()
{
this.Rows = new Collection<TableData>();
this.Rows.Add(...
}
}
ViewModel:
public class TableViewModel
{
private ITableManager _tableManager;
public TableViewModel() : base(new TableManager())
{
}
// for dependency injection (recommended)
public TableViewModel(ITableManager tableManager)
{
_tableManager = tableManager;
_tableManager.GetData();
}
public ObservableCollection<TableData> Rows
{
get { return _tableManager.Rows; }
}
}
视图:
<ctrls:CustomDataGrid
ItemsSource={Binding Rows}
AutoGenerateColumns=True
>
<!-- Use AutoGenerateColumns if the # of sectors is dynamic -->
<!-- Otherwise,define columns manually,like so: -->
<DataGridTextColumn
Width=\"*\"
Header=\"SectorA\"
Binding=\"{Binding Country}
/>
</ctrls:CustomDataGrid>
我在视图中使用了“ 3”,因为我假设您将继承自己的DataGrid。这将允许您覆盖事件以根据自己的喜好自定义DataGrid:
public class CustomDataGrid : DataGrid
{
public override Event...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。