0

私はObjectmodelいくつかのネストされたコレクションを持っています:

public class MainViewModel :  BaseViewModel
{
    private Dictionary<String, Diagram> _diagrams;

    public Dictionary<String, Diagram> Diagrams
    {
        get { return _diagrams; }
        set
        {
            _diagrams = value;
            OnPropertyChanged("Diagrams");
        }
    }

}

BaseViewmodelはを実装しINotifyPropertyChangedます。中Diagramには曲線のコレクションがあります:

public class Diagram
{
    private  ObservableCollection<DiagramCurve> curves;
    [JsonIgnoreAttribute]
    public ObservableCollection<DiagramCurve> Curves
    {
        get { return curves; }
    }

    public Diagram()
    {
        curves = new ObservableCollection<DiagramCurve>();
    }
}

DiagramCanvasXaml内ののインスタンスに次のようにバインドします。

    <wd:DiagramCanvas x:Name="diagramCanvas" 
                          Diagram ="{Binding Diagrams[Diagram1]}"  
                          Grid.Row="2" Grid.Column="1" 
                          Height="auto" Width="Auto"  
                          HorizontalAlignment="Stretch"  
                          VerticalAlignment="Stretch" 
                          Margin="10"   
                          Background="{StaticResource DiagrambackgroundBrush }" />

MainViewこれは、完全に新しいDiagramsコレクションのDiagramsプロパティを割り当てると正常に機能します。しかし、私が必要としているのはDiagramCanvas、カーブコレクションが変更されたときにコントロールが更新されることです。しかし、これは起こりません。

4

2 に答える 2

0

バインディングはMainViewModel Diagramsプロパティにあり、「Diagram1」文字列に対応する図を選択します。バインディングパスにはCurvesプロパティの記述がないため、カーブがCollectionChangedイベントをスローしたときにバインディングは更新されません。これを防ぐために、でこのイベントに登録し、それが来たら辞書に適切な図のイベントをMainViewModelスローすることができます。PropertyChanged

しかし...私が間違っていなければ、.Netディクショナリは実装されておらずINotifyCollectionChanged、とにかくバインディングが更新されるかどうかはわかりません。あなたは私に知らせておくように努めるべきです。

ハッピーコーディング、

アントワーヌ

于 2013-02-13T19:54:40.607 に答える
0

Diagram'ObservableCollection'から継承しようとしましたが、コレクション内のアイテムが削除されたときにObservableCollection依存関係プロパティが更新されないため、これでも役に立ちませんでした。

CustomControlのDependencyPropertyは、インスタンスのプロパティではなくDiagramCanvasディクショナリの値アイテムにバインドされるため、インスタンスのプロパティが変更されても、DependencyPropertyのイベントは発生しません。MainViewModel.DiagramsDiagramOnPropertyChangedDiagramCanvasDiagram

ディクショナリ内の値アイテムに新しい値が割り当てられた場合にのみMainViewModel.Diagrams、このイベントが発生します。これは、のに新しい値が割り当てられるためDependencyPropertyですDiagramCanvas

したがって、コレクションのイベントを手動でサブスクライブする必要があります。

public class DiagramCanvas : Canvas
{
  // Is called only when new Items get inserted info the Dictionary
  static void OnDiagramPropertyChanged(DependencyObject obj, 
                                     DependencyPropertyChangedEventArgs args)
  {
      DiagramCanvas THIS = (DiagramCanvas)obj;

      Diagram new_diagram = (Diagram)args.NewValue;
      Diagram old_diagram = (Diagram)args.NewValue;

      if (old_diagram != null)
      {
        // Unsubscribe from CollectionChanged on the old collection
        old_diagram.Curves.CollectionChanged -= THIS.OnCollectionChanged;
      }

      if (new_diagram != null)
      {
        // Subscribe to CollectionChanged on the new collection
        new_diagram.Curves.CollectionChanged += THIS.OnCollectionChanged;
      }
  }

  //Is called everytime the Curves collecion changes
  void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
  {

  }
}
于 2013-02-14T10:57:06.677 に答える