奇妙な行動が続いています。私は MVVM パターンを使用しています。AlarmCollection という名前の Observable コレクションを、AlarmView という名前のビューのグリッド コントロールにバインドしています。AlarmModelView クラスの複数のインスタンスを作成し、AlarmCollection にアイテムを追加すると、すべてのインスタンスに変更が表示されます。
ObservableColelction AlarmCollection への変更は、グリッド コントロールのすべてのバインドされた ItemSources に影響します。
同様の投稿 here から、ディスパッチャースレッドをロックしようとしましたが、役に立ちませんでした。
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);
}
}
}