如果另一个类中的ObservableCollection如何更改ItemsSource?

时间:2016-01-11 07:17:59

标签: c# list telerik observablecollection itemssource

我想更改我的ItemsSource,但我在另一个类中设置了ObservableCollection。如果不存在ObservableCollection,我如何能AddItemsSource一些东西?

修改窗口中的

private void manageLayout_Click(object sender, Telerik.Windows.RadRoutedEventArgs e)
    {
        ...
        scheduleDetail = assetListClass.GetScheduleDetail(xmlScheduleDetail);
        ObservableCollection<LibraryData> scheduleDetailOC = new ObservableCollection<LibraryData>(scheduleDetail);
        ManageLayout manageLayoutWin = new ManageLayout();
        this.Close();
        manageLayoutWin.Show();
        manageLayoutWin.ManageLayout_GridView.ItemsSource = scheduleDetailOC;
        ...
     }

如果它在同一个类中我可以使用这个代码:

scheduleDetailOC.Add(abc);

但如果它在另一个班级怎么办?我应该在 ManageLayout 窗口中更改ItemsSource?我试过这个:

ManageLayout_GridView.Items.Add(abc);

我有一个错误:

  

使用ItemsSource时,操作无效。访问和修改   而使用ItemsControl.ItemsSource的元素

1 个答案:

答案 0 :(得分:0)

首先,您需要在类字段/属性中存储对集合的引用。要从其他类访问,此属性应该是公共的。

public class FirstClass
{
    public ObservableCollection<LibraryData> ScheduleDetails { get; private set; }

    private void manageLayout_Click(object sender, Telerik.Windows.RadRoutedEventArgs e)
    {
        ...
        scheduleDetail = assetListClass.GetScheduleDetail(xmlScheduleDetail);
        ScheduleDetails = new ObservableCollection<LibraryData>(scheduleDetail);
        ManageLayout manageLayoutWin = new ManageLayout();
        this.Close();
        manageLayoutWin.Show();
        manageLayoutWin.ManageLayout_GridView.ItemsSource = ScheduleDetails;
        ...
     }
}

现在,您可以通过引用第一个类来操作集合。您可以使用Dependency injection来保存参与。如果你的第二个类需要向第一个类添加元素,最简单的方法是使用构造函数参数:

public class AnotherClass
{
    private readonly FirstClass collectionHolder;

    public AnotherClass(FirstClass collectionHolder)
    {
        this.collectionHolder = collectionHolder;
    }

    public void AddElement()
    {
        var newElement = GetNewElement(); // creates element that will be add to the collection
        collectionHolder.ScheduleDetails.Add(newElement);
    }
}

它会起作用但不好,因为现在AnotherClass知道FirstClass公共接口的所有内容。另一个原因是所有引用FirstClass的类都可以操纵公共集合。

好的设计是为FirstClass创建新界面,该界面仅包含允许的操作,并在AnotherClass中使用。

public interface IScheduleDetailsCollectionHolder
{
    void AddElement(LibraryData data);
}

public class FirstClass : IScheduleDetailsCollectionHolder
{
    private ObservableCollection<LibraryData> scheduleDetails;

    private void manageLayout_Click(object sender, Telerik.Windows.RadRoutedEventArgs e)
    {
        ...
        scheduleDetail = assetListClass.GetScheduleDetail(xmlScheduleDetail);
        scheduleDetails = new ObservableCollection<LibraryData>(scheduleDetail);
        ManageLayout manageLayoutWin = new ManageLayout();
        this.Close();
        manageLayoutWin.Show();
        manageLayoutWin.ManageLayout_GridView.ItemsSource = scheduleDetails;
        ...
     }

     public void AddElement(LibraryData data)
     {
         scheduleDetails.Add(data);
     }
}

public class AnotherClass
{
    private readonly IScheduleDetailsCollectionHolder collectionHolder;

    public AnotherClass(IScheduleDetailsCollectionHolder collectionHolder)
    {
        this.collectionHolder = collectionHolder;
    }

    public void AddElement()
    {
        var newElement = GetNewElement(); // creates element that will be add to the collection
        collectionHolder.AddElement(newElement);
    }
}

另一个建议是使用MVVM模式和data binding,这是WPF应用程序的标准事实。