wpf DataGrid绑定到ObservableCollection< ParentType>添加Children类型的行,canUserAddName =“true”

ijnw1ujt  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(90)

我正在尝试重构一些类,这些类有很多重复的代码,很难维护。它们都是具有类似行为的用户控件,并且总是在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?
如果我的描述不清楚,请告诉我。

6jjcrrmo

6jjcrrmo1#

WorkItem不能是abstract。如果你想创建Article对象,你应该将源集合的类型从ObservableCollection<WorkItem>更改为ObservableCollection<Article>
要使CanUserAddRows属性按预期工作,IEnumerable<T>的类型T(被设置为DataGridItemsSource)必须具有公共默认构造函数。这是一项要求。
通过处理InitializingNewItem事件并以编程方式设置值,可以为T类型的新项设置值。
如果您想进一步自定义对象的创建,您可能应该将CanUserAddRows设置为false,并实现您自己的自定义解决方案,将项添加到源集合中。

91zkwejq

91zkwejq2#

我偶然发现了一个对我有效的解决方案(我必须说,这是非常偶然的)。我想我会在这里分享它,如果有人曾经面临同样的问题,我做了。

<DataGrid CanUserAddRows="True"
          AddingNewItem="DataGrid_AddingNewItem"
          ItemsSource="{Binding LstMasterData_AFF, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

我的AddingNewItem简单如下:

private void DataGrid_AddingNewItem(object sender, AddingNewItemEventArgs e)
{
    e.NewItem = new Article();
}

这个很好用我甚至能够把我的WorkItem类作为我最初想要的抽象类。
我将保留mm8解决方案,因为我认为它总体上是更好的答案,但这个解决方案对我来说很有效,并且在我的环境中更好(解决方案不使用MVVM模式)。

相关问题