我想更改我的ItemsSource
,但我在另一个类中设置了ObservableCollection。如果不存在ObservableCollection,我如何能Add
给ItemsSource
一些东西?
:
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的元素
答案 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应用程序的标准事实。