繁体   English   中英

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

[英]View model Property setter not hit when dependency property updated

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

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]);                                                         
   }                 
 }

在视图模型中,我具有此属性和支持变量:

 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}"/>

依赖项属性集合被初始化并填充,但是当依赖项属性集合发生更改(添加)时,视图模型属性设置器将永远不会被点击。 我在输出窗口中没有绑定错误。 我在这里想念什么吗?

看起来您是在向集合中添加项目,而不是替换集合。 您不会以这种方式访问​​vm collection属性的设置器。

如果要让视图模型响应添加到SelectedExclusionsToDelete集合中的项,则视图模型将需要处理SelectedExclusionsToDelete.CollectionChanged事件。 “正确地”处理该事件(删除,添加,移动,清除等)确实很麻烦,但是如果它不是一个庞大的集合,则通常可以快速而又轻松地摆脱某些东西:将所有更改视为一个全新的集合。 我认为您也确实如此。

另外,对于更快,更脏的方法,我认为默认情况下可以将其设置为双向绑定,并让控件为OnKeyDown this.SelectedExclusions分配一个新的ObservableCollection 绑定会将​​其传递回ViewModel并点击设置器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM