- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个用户控件,它公开了一个名为 VisibileItems 的 DependencyProperty每次更新该属性时,我都需要触发另一个事件。为此,我添加了一个带有 PropertyChangedCallback 事件的 FrameworkPropertyMetadata。
出于某种原因,此事件仅被调用一次,并且在 VisibleItems 下次更改时不会触发。
XAML:
<cc:MyFilterList VisibleItems="{Binding CurrentTables}" />
CurrentTables 是 MyViewModel 上的 DependencyProperty。 CurrentTables 经常更改。我可以将另一个 WPF 控件绑定(bind)到 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)。绑定(bind)以某种方式适用于第一个属性更改,但不适用于后续属性更改?尝试按照你们中的某些人的建议使用 snoop 检查此问题。
最佳答案
您是否正在为也具有 OneWay
绑定(bind)的依赖属性设置“本地”值(即直接分配给依赖属性 setter )?如果是这样,设置本地值将删除绑定(bind),如 the MSDN dependency property overview: 中所述
Bindings are treated as a local value, which means that if you set another local value, you will eliminate the binding.
当被要求将本地值存储在依赖属性上时,依赖属性机制无能为力。它无法通过绑定(bind)发送值,因为绑定(bind)“指向”错误的方式。设置为本地值后,它不再显示从绑定(bind)中获得的值。因为它不再显示绑定(bind)的值,所以它删除了绑定(bind)。
绑定(bind)消失后,当绑定(bind)的源属性更改其值时,将不再调用 PropertyChangedCallback
。这可能就是未调用回调的原因。
如果您将绑定(bind)设置为TwoWay
,则绑定(bind)系统确实有地方可以存储您设置的“本地”值:在绑定(bind)的源属性中。在这种情况下,不需要消除绑定(bind),因为依赖属性机制可以将值存储在源属性中。
这种情况不会导致堆栈溢出,因为会发生以下情况:
PropertyChanged
,PropertyChanged
事件,检查源属性的新值,发现它没有改变,什么也不做。这里的关键点是,如果您为 其值未更改的属性触发 PropertyChanged
事件,则任何 PropertyChangedCallback
绑定(bind)到您的属性的依赖属性将不会被调用。
为简单起见,我忽略了上面的 IValueConverter
。如果您有转换器,请确保它在两个方向上都能正确转换值。我还假设另一端的属性是实现 INotifyPropertyChanged
的对象的 View 模型属性。在绑定(bind)的源端可能有另一个依赖属性。依赖属性机制也可以处理这个问题。
碰巧,WPF(和 Silverlight)不包含对堆栈溢出的检测。如果在 PropertyChangedCallback
中,您将依赖属性的值设置为其新值(例如,通过递增整数值属性或将字符串附加到字符串值属性),您会出现堆栈溢出。
关于c# - WPF:PropertyChangedCallback 只触发一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5795770/
我有一个用户控件,它有两个 DependencyProperties。每个 DependencyProperty 都有 PropertyChangedCallback。在设置属性值的顺序中调用回调很重
看起来 WPF 并不总是调用 DependencyProperty 的已注册 PropertyChangedCallback 过程。即使我们从 VM 手动引发 PropertyChanged 事件,W
这已经困扰我一段时间了,所以我问了一个同事他是否能理解它,现在我来了;) 为什么可以在依赖属性的 PropertyChangedCallback 中访问持有类的私有(private)成员? 让我通过这
我有一个 TextBox 绑定(bind)到一个依赖属性,我已经实现了一个 PropertyChangedCallBack 函数,当文本更改时我需要调用 textbox.ScrollToEnd() 但
如果有自己的用户控件,带有 DependencyProperty 和相应的回调方法,如下所示: public partial class PieChart : UserControl { pu
我有一个依赖属性和一个回调。 public static readonly DependencyProperty IsBusyProperty = DependencyProp
我有一个派生自 System.Windows.Controls.UserControl 的类,我需要将 PropertyChangedCallback 添加到 FrameworkElement.Mar
我创建了一个派生自 Canvas 的控件,它应该绘制一个实时图表,给定值通过绑定(bind)传递给 DependencyProperty。简化版是这样的: public class Plotter :
我有一个具有三个属性 (x1,x2,x3) 和该属性的 PropertyChangedCallback 的对象集合。 此集合绑定(bind)到 Wpf DataGrid。然后我想用像“x1+x2”这样
我有一个类的依赖属性,我们称它为“SomethingControl”: public static readonly DependencyProperty SomethingProperty = De
我有一个用户控件,它公开了一个名为 VisibileItems 的 DependencyProperty每次更新该属性时,我都需要触发另一个事件。为此,我添加了一个带有 PropertyChanged
我正在创建一个具有PropertyChangedCallback依赖项属性的WPF CustomControl。在该Callback方法中,我尝试使用GetTemplateChild()方法从OnAp
DependencyProperty.OverrideMetadata() 是否也覆盖了 PropertyChangedCallback? 最佳答案 取自此处:http://msdn.microsof
DependencyProperty.OverrideMetadata() 是否也覆盖了 PropertyChangedCallback? 最佳答案 取自此处:http://msdn.microsof
我的大体理解是,当属性发生变化时,会立即执行本地回调。所以我可以假设这会立即发生。但是,绑定(bind)属性的回调在绑定(bind)传播之前不会发生,这可能不会立即发生。这是正确的吗? 最佳答案 听起
我想在每次更改属性时执行一些代码。以下在一定程度上起作用: public partial class CustomControl : UserControl { public bool
我有一个带有文本框的用户控件和一个基本上是带有 CollectionView 的 ListBox 的自定义列表控件。我想使用 CollectionView 的过滤器功能并使用文本框中的文本来过滤可见元
我正在创建一个 WinRT CustomControl,它具有 PropertyChangedCallback 的依赖属性。在该回调方法中,我尝试为我使用 GetTemplateChild() 方法从
我的应用程序使用 MVVM 架构,ViewModel 不了解 View。当 ViewModel 对象需要显示新 View 时,它会公开一个公共(public) ShowNewView 属性,该属性是一
我需要从 ViewModel 将焦点设置到 UIElement 的附加属性。我创建了 Attached 属性,并在 PropertyChangedCallback 中将焦点设置到 UIElement。
我是一名优秀的程序员,十分优秀!