【发布时间】:2011-08-13 08:07:15
【问题描述】:
我有一个用户控件,它公开了一个名为 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 来检查这个问题。
【问题讨论】:
-
您确定绑定保持不变吗?我会使用 Snoop 来验证绑定是否正确更新了 VisibleItems 属性。
-
您暗示但不明确:您确定
VisibleItems实际上更改为不同的值而没有调用属性更改回调吗? -
Rick,是的,我敢肯定,我可以单步执行它并查看它是否被调用,现在我在每次调用时创建一个“新列表”以确保它不是同一个实例。而且如果你看一下代码,你会发现它每次都从数据库中获取列表。
-
证明 CurrentTables 正在改变并不能证明 VisibleItems 正在改变。您的绑定可能已损坏或其他原因。我怀疑 VisibleItems 实际上并没有改变,这就是为什么我建议使用 Snoop 来确保绑定正常工作。
-
克莱默,继续。我做了一个不同的测试,它确实似乎问题出在 VisibleItems 和 CurrentTables 之间……需要做一些调查,看看为什么它们在第一次尝试时起作用,但在随后却不起作用……
标签: c# .net wpf dependency-properties propertychanged