我有一种奇怪的行为。我正在使用MVVM模式,我将名为AlarmCollection的Observable集合绑定到名为AlarmView的View中的网格控件。当我创建AlarmModelView类的多个实例,并将项添加到AlarmCollection时,所有实例都会显示更改。
对ObservableColelction AlarmCollection的任何更改都会影响网格控件的所有绑定ItemSource。
我试图从此处的类似帖子锁定调度程序线程,但无济于事。
是否仍然要在ViewModel的每个实例中保留对此Observable集合的更改?这样每个修改都不会影响UI线程中的任何其他集合。
感谢任何帮助。
[编辑如下]
奇怪的是,我需要通过创建Child MV的新实例来缩放/钻取所呈现的内容,而后者又会向Parent MV添加选项卡。子视图都绑定到相同的Collection名称,并且所有都通过WCF异步调用进行更新。我需要X个多个实例,基于缩放级别的深度,所以我需要1个ModelView对象。
如何使用CollectionChanged事件或创建ModelView自己的CollectionView来实现此目的?
private MainViewModel _parentViewModel;
public MainViewModel ParentViewModel
{
get { return _parentViewModel; }
set
{
if (ParentViewModel == value) { return; }
SetPropertyValue(ref _parentCircuitViewModel, value, "ParentViewModel");
}
}
private ObservableCollection<DetailEntity> _alarmCollection;
public ObservableCollection<DetailEntity> AlarmCollection
{
get
{
if (_alarmCollection == null)
_alarmCollection = new ObservableCollection<DetailEntity>();
return _alarmCollection;
}
private set { _alarmCollection = value; }
}
ServiceNode _selectedNode;
public ServiceNode SelectedNode
{
get { return _selectedNode; }
set
{
SetPropertyValue(ref _selectedNode, value, "SelectedNode");
// render selected child node service path
RenderSubPath(_selectedNode);
// reset storage value
_selectedCircuitNode = null;
}
}
// Constructor
public RenderViewModel(string servicePath CircuitMainViewModel parentViewModel)
{
ServicePath = servicePath,
ParentCircuitViewModel = parentViewModel;
// event to handler for completed async calls
Client.GetAlarmsByNodeListCompleted += new EventHandler<GetAlarmsByNodeListCompletedEventArgs>(Client_GetAlarmsByNodeListCompleted);
}
void RenderSubPath(ServiceNode childNode)
{
if (childNode == null)
return;
// create a new child instance and add to parent VM tab
_parentViewModel.AddServiceRenderTab(new ViewModel.Workspaces.RenderViewModel(childNode.elementPath _parentViewModel);
}
// wcf async webservice call to add alarm to ObservableCollection
// ** This is updating all Collections in all Views.
void Client_GetAlarmsByNodeListCompleted(object sender, AlarmServiceReference.GetAlarmsByNodeListCompletedEventArgs e)
{
try
{
if (e.Result == null)
return;
// add to parent Netcool alarm collection
foreach (DetailEntity alarm in nodeAlarms)
{
_alarmCollection.Add(alarm);
}
}
}
答案 0 :(得分:1)
从您的描述中,听起来好像所有视图都绑定到同一个底层集合。对于您绑定的任何集合,WPF实际上将绑定到包含该集合的集合视图(ICollectionView)。如果您没有显式创建自己的集合视图,它将使用默认的集合视图。对同一个集合的任何绑定都将导致使用相同的集合视图。
很难说没有看到你的代码,但你可能想要使用底层视图模型的单独实例(因此,集合),或者你想要显式创建单独的集合视图并绑定到它们