视图模型属性设置器在更新依赖项属性时未命中

时间:2017-01-23 14:30:44

标签: c# wpf xaml

我有一个带依赖项属性的用户控件:

public ObservableCollection<Exclusion> SelectedExclusions
{
    get
    {
        return (ObservableCollection<Exclusion>)GetValue(SelectedExclusionsProperty);
    }
    set
    {
        SetValue(SelectedExclusionsProperty, value);
    }
}

public static readonly DependencyProperty SelectedExclusionsProperty =
       DependencyProperty.Register(nameof(TimeSeriesChart.SelectedExclusions), 
                                   typeof(ObservableCollection<Exclusion>), 
                                   typeof(TimeSeriesChart), 
                                   new PropertyMetadata(default(ObservableCollection<Exclusion>)));

我在按键时向该集合中添加了一个选定的排除项:

 protected override void OnKeyDown(KeyEventArgs e)
 {
   if(e.Key == Key.Delete)               
   {                       
     this.SelectedExclusions.Add(this.ExclusionProviders[0].Exclusions[this.hitTestInfo.DataSeriesIndex]);                                                         
   }                 
 }

在视图模型中,我有这个属性&amp;支持变量:

 private ObservableCollection<TimeSeriesLibraryInterop.Exclusion> selectedExclusionsToDelete = new ObservableCollection<TimeSeriesLibraryInterop.Exclusion>();

 public ObservableCollection<TimeSeriesLibraryInterop.Exclusion> SelectedExclusionsToDelete
   {
     get
      {
        return this.selectedExclusionsToDelete;
      }
      set
       {
         this.selectedExclusionsToDelete = value;       
         this.RaisePropertyChanged();                          
       }
     }

最后在视图中绑定:

   <userControl1 SelectedExclusions="{Binding SelectedExclusionsToDelete, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

初始化并填充依赖项属性集合,但是当依赖项属性集合更改(添加)时,永远不会命中视图模型属性setter。我在输出窗口中没有绑定错误。我在这里找不到什么东西?

1 个答案:

答案 0 :(得分:1)

看起来您正在向集合添加项目而不是替换集合。你不会以这种方式点击vm集合属性的setter。

如果您希望viewmodel响应要添加到SelectedExclusionsToDelete集合的项目,则viewmodel将需要处理SelectedExclusionsToDelete.CollectionChanged事件。 “正确”处理该事件(删除,添加,移动,清除等)是一件非常麻烦的事情,但如果它不是一个巨大的集合,你可以经常逃脱一些快速和肮脏的事情:将任何变化视为一个全新的集合。我认为你的情况也是如此。

或者,对于更快更脏的方法,我认为默认情况下您可以将其设为双向绑定,并让控件在ObservableCollection中为this.SelectedExclusions分配一个新的OnKeyDown 。绑定会将​​其传递回viewmodel并点击setter。