0

奇妙な行動が続いています。私は 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);
              }

          }
     }
4

1 に答える 1

1

あなたの説明から、すべてのビューが同じ基礎となるコレクションにバインドされているように聞こえます。バインド先のコレクションの場合、WPF は実際には、そのコレクションをラップするコレクション ビュー (ICollectionView) にバインドします。独自のコレクション ビューを明示的に作成しない場合は、既定のコレクション ビューが使用されます。同じコレクションにバインドすると、同じコレクション ビューが使用されます。

コードを見ずに言うのは難しいですが、基になるビュー モデル (したがってコレクション) の別のインスタンスを使用するか、別のコレクション ビューを明示的に作成してそれらにバインドする必要がある可能性があります。

于 2012-09-17T21:27:14.460 に答える