具有嵌套集合的WPF数据绑定不会更新控件

时间:2013-02-13 17:00:14

标签: wpf data-binding collections

我有一个Objectmodel包含一些嵌套的集合:

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

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

}

Base Viewmodel实现INotifyPropertyChanged。在Diagram里面有一个曲线集合:

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

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

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

    <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控制得到更新。但这不会发生。

2 个答案:

答案 0 :(得分:0)

您的绑定位于MainViewModel Diagrams属性上,并选择与“Diagram1”字符串对应的图表。在绑定路径中,没有提及Curves属性,因此当Curves抛出CollectionChanged事件时,绑定不会更新。为了防止这种情况发生,您可以在MainViewModel中注册此事件,并在字典中抛出好PropertyChanged事件。

但是......如果我没弄错的话.Net字典没有实现INotifyCollectionChanged,我也不确定绑定是否会更新。你应该试着让我知情。

快乐编码,

安托

答案 1 :(得分:0)

我尝试从'ObservableCollection'继承Diagram,但即使这样也无法解释,如ObservableCollection dependency property does not update when item in collection is deleted所述。

由于CustomControl DiagramCanvas的DependencyProperty绑定到Dictionary MainViewModel.Diagrams的值项而不绑定到Diagram实例的属性,因此DependencyProperty没有OnPropertyChanged事件当DiagramCanvas实例的属性发生变化时,会触发Diagram

只有在为词典MainViewModel.Diagrams内的值项目分配新值时,才会触发此事件,因为这会为DependencyProperty的{​​{1}}分配新值。

因此我必须手动订阅集合的事件:

DiagramCanvas