我有一个奇怪的行为。我正在使用 MVVM 模式,我将一个名为 AlarmCollection 的 Observable 集合绑定到一个名为 AlarmView 的视图中的网格控件。当我创建 AlarmModelView 类的多个实例并将项目添加到 AlarmCollection 时,所有实例都会显示更改。
对 ObservableColelction AlarmCollection 的任何更改都会影响网格控件的所有绑定 ItemSource。
我试图从此处的类似帖子中锁定调度程序线程,但无济于事。
无论如何要在 ViewModel 的每个实例中保留对这个 Observable 集合的更改?这样每次修改都不会影响 UI 线程中的任何其他集合。
任何帮助表示赞赏。
[在下面编辑]
这是一个奇怪的场景,我需要通过创建子 MV 的新实例来缩放/钻取渲染的内容,这反过来又将选项卡添加到父 MV。子视图都绑定到相同的集合名称,并且都通过 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);
}
}
}