我有一个带依赖项属性的用户控件:
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。我在输出窗口中没有绑定错误。我在这里找不到什么东西?
答案 0 :(得分:1)
看起来您正在向集合添加项目而不是替换集合。你不会以这种方式点击vm集合属性的setter。
如果您希望viewmodel响应要添加到SelectedExclusionsToDelete
集合的项目,则viewmodel将需要处理SelectedExclusionsToDelete.CollectionChanged
事件。 “正确”处理该事件(删除,添加,移动,清除等)是一件非常麻烦的事情,但如果它不是一个巨大的集合,你可以经常逃脱一些快速和肮脏的事情:将任何变化视为一个全新的集合。我认为你的情况也是如此。
或者,对于更快更脏的方法,我认为默认情况下您可以将其设为双向绑定,并让控件在ObservableCollection
中为this.SelectedExclusions
分配一个新的OnKeyDown
。绑定会将其传递回viewmodel并点击setter。