我正在尝试重构一些类,这些类有很多重复的代码,很难维护。它们都是具有类似行为的用户控件,并且总是在ObservableCollection中显示不同类型的对象。
为此,我创建了两个新的类来refatcor函数,我可以总结为:
public class WorkItem : INotifyPropertyChanged
{
protected string _typeModif = "";
public string typeModif
{
get { return _typeModif; }
set { _typeModif = value; }
}
public WorkItem()
{
typeModif = "";
}
// Property changed stuff
}
和
public abstract class ChildUserControl_MasterData
{
public ObservableCollection<WorkItem> LstMasterData_AFF = new ObservableCollection<WorkItem>();
}
我在孩子们的课堂上是这样用的:
public partial class MD_Article : ChildUserControl_MasterData
{
DataSet ds = clsInterfaceBD.getLstArticle();
if (ds.Tables.Count > 0)
{
foreach (DataRow dr in ds.Tables[0].Rows)
{
LstMasterData_AFF.Add(new Article(dr));
}
}
}
public class Article : WorkItem
{
public Article()
{
...
}
}
<DataGrid CanUserAddRows="True"
ItemsSource="{Binding LstMasterData_AFF, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
一切都显示正确,但我的问题发生时,我想添加一个新的行。我不得不继续使用旧的方法来插入与CanUserAddsign一起工作的行。该对象是用WorkItem
类型创建的,这必须是默认行为。但这也带来了几个问题:
- 我不能创建WorkItem和抽象类,这在一开始就应该是这样的,因为CanUserAddItem想要创建类的示例。
- 当我想对Collection进行操作时,它的类型是WorkItem而不是Article,我无法处理Article。
有没有一种方法我错过了使新的一行的正确类型使用AddNews.exe?
如果我的描述不清楚,请告诉我。
2条答案
按热度按时间6jjcrrmo1#
WorkItem
不能是abstract
。如果你想创建Article
对象,你应该将源集合的类型从ObservableCollection<WorkItem>
更改为ObservableCollection<Article>
。要使
CanUserAddRows
属性按预期工作,IEnumerable<T>
的类型T
(被设置为DataGrid
的ItemsSource
)必须具有公共默认构造函数。这是一项要求。通过处理
InitializingNewItem
事件并以编程方式设置值,可以为T
类型的新项设置值。如果您想进一步自定义对象的创建,您可能应该将
CanUserAddRows
设置为false
,并实现您自己的自定义解决方案,将项添加到源集合中。91zkwejq2#
我偶然发现了一个对我有效的解决方案(我必须说,这是非常偶然的)。我想我会在这里分享它,如果有人曾经面临同样的问题,我做了。
我的AddingNewItem简单如下:
这个很好用我甚至能够把我的WorkItem类作为我最初想要的抽象类。
我将保留mm8解决方案,因为我认为它总体上是更好的答案,但这个解决方案对我来说很有效,并且在我的环境中更好(解决方案不使用MVVM模式)。