我有一个用户控件,它公开了一个名为 VisibileItems 的 DependencyProperty 每次更新该属性时,我都需要触发另一个事件。为此,我添加了一个带有 PropertyChangedCallback 事件的 FrameworkPropertyMetadata。
由于某种原因,此事件仅被调用一次,并且不会在下次更改 VisibleItems 时触发。
XAML:
<cc:MyFilterList VisibleItems="{Binding CurrentTables}" />
CurrentTables 是 MyViewModel 上的 DependencyProperty。CurrentTables 经常更改。我可以将另一个 WPF 控件绑定到 CurrentTables,并且我可以看到 UI 中的更改。
这是我用 PropertyChangedCallback 连接 VisibleItems 的方式
public static readonly DependencyProperty VisibleItemsProperty =
DependencyProperty.Register(
"VisibleItems",
typeof(IList),
typeof(MyFilterList),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(VisiblePropertyChanged))
);
public IList VisibleItems {
get { return (IList)GetValue(VisibleItemsProperty); }
set { SetValue(VisibleItemsProperty, value); }
}
通过进入 VisiblePropertyChanged,我可以看到它在第一次设置 CurrentTables 时被触发。但不是以后的时间。
更新
正如你们中的一些人质疑 CurrentTables 的修改方式,它在更改时完全重新分配:
OnDBChange()...
CurrentTables = new List<string>(MainDatabaseDataAdapter.GetTables(this.SelectedServer, this.SelectedDatabase));
每次更改都会调用此行,但我的 VisiblePropertyChanged 处理程序仅在第一次调用。
更新
如果我直接分配 VisibleItems,则每次都会调用处理程序!
TestFilterList.VisibleItems = new List<string>( Enumerable.Range(1, DateTime.Now.Second).ToList().Select(s => s.ToString()).ToList() );
因此,看起来问题源于 DependencyProperty (VisibleItems) 监视另一个 DependencyProperty (CurrentTables)。不知何故,绑定适用于第一次属性更改,但不适用于后续更改?正如你们中的一些人建议的那样,尝试用 snoop 来检查这个问题。