我有一个用户控件,它公开一个名为 VisibileItems 的 DependencyProperty
每次更新该属性时,我都需要触发另一个事件。
为了实现这一点,我添加了带有 PropertyChangedCallback 事件的 FrameworkPropertyMetadata。
由于某种原因,此事件仅被调用一次,并且下次 VisibleItems 更改时不会触发。
XAML:
<cc:MyFilterList VisibleItems="{Binding CurrentTables}" />
CurrentTables 是 MyViewModel 上的 DependencyProperty。 CurrentTables 经常更改。我可以将另一个 WPF 控件绑定到 CurrentTables,并且可以看到 UI 中的更改。
这是我将 VisibleItems 与 PropertyChangedCallback 连接的方式
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); }
}
通过进入 Visible PropertyChanged,我可以看到它在第一次设置当前表时被触发。但随后的时间就不会了。
UPDATE
正如你们中的一些人质疑 CurrentTables 的修改方式一样,它在更改时完全重新分配:
OnDBChange()...
CurrentTables = new List<string>(MainDatabaseDataAdapter.GetTables(this.SelectedServer, this.SelectedDatabase));
每次更改都会调用此行,但我的 VisiblePropertyChanged 处理程序仅在第一次时被调用。
UPDATE
如果我直接分配 VisibleItems,处理程序每次都会被调用!
TestFilterList.VisibleItems = new List<string>( Enumerable.Range(1, DateTime.Now.Second).ToList().Select(s => s.ToString()).ToList() );
因此,问题似乎源于 DependencyProperty (VisibleItems) 监视另一个 DependencyProperty (CurrentTables)。不知何故,绑定适用于第一个属性更改,但不适用于后续属性更改?
正如你们中的一些人所建议的,尝试用窥探来检查这个问题。