0

我有Objectmodel一些嵌套的集合:

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

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

}

基础 Viewmodel 实现INotifyPropertyChanged。里面Diagram有一组曲线:

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

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

DiagramCanvas我绑定到我的 Xaml中的一个实例,如下所示:

    <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 Dictionary 没有实现INotifyCollectionChanged,而且我不确定绑定是否会更新。你应该试着让我了解情况。

快乐编码,

安托万

于 2013-02-13T19:54:40.607 回答
0

我试图Diagram从“ObservableCollection”继承,但即使这也没有帮助,因为ObservableCollection 依赖属性在删除集合中的项目时不会更新解释。

由于我的 CustomControl 的 DependencyPropertyDiagramCanvas绑定到 Dictionary 的值项而MainViewModel.Diagrams不是实例的Diagram属性,因此当实例的属性发生更改时,不会触发OnPropertyChangedDependencyProperty 的事件。DiagramCanvasDiagram

仅当为 Dictionary 内的值项分配新值时MainViewModel.Diagrams,才会触发此事件,因为这会为DependencyPropertyof分配一个新值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 回答