- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 WPF 中有一个可视化控件,它利用了依赖属性。这些属性由字段支持,这些字段是类,有时需要通知所有绑定(bind),当实际包含的类被修改时,属性值已更改。
简单地说:
MSDN 说,当第一次使用依赖属性时,PropertyChanged 附加到 DependencyObject。它在 Visual Studio 2010 中工作。但是,在安装 Visual Studio 2012 之后,它停止工作:即使使用了 DP(例如绑定(bind)附加到它),PropertyChanged 为 null,我无法通知任何人更改。
我仍然使用 Visual Studio 2010 编译器工具包,所以看起来,这是一个损坏的框架问题,它与 VS 2012 一起更新。
我是否正确使用了 PropertyChanged 事件?或者它是 VS 2012 更新的 .NET 4.0 框架中的错误?有没有人遇到过类似的问题?
编辑:一段错误代码:
public partial class MyImageControl : INotifyPropertyChanged,
IHandle<ImageRefresh>
{
// ***************************
// *** Dependency property ***
// ***************************
private void OnDataSourceChanged()
{
// ...
}
private static void DataSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is MyImageControl)
((MyImageControl)d).OnDataSourceChanged();
}
public static readonly DependencyProperty DataSourceProperty = DependencyProperty.Register("DataSource",
typeof(IDataSource),
typeof(MyImageControl),
new PropertyMetadata(null, DataSourceChanged));
public IDataSource DataSource
{
get
{
return (IDataSource)GetValue(DataSourceProperty);
}
set
{
SetCurrentValue(DataSourceProperty, value);
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("DataSource"));
}
}
// ***********************************
// *** INotifyPropertyChanged impl ***
// ***********************************
public event PropertyChangedEventHandler PropertyChanged;
// *************************************
// *** Method, which exposes the bug ***
// *************************************
public void Handle(ImageRefresh message)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("BackgroundKind"));
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("DataSource"));
}
}
作为引用,IHandle 接口(interface):
public interface IBaseHandle { }
public interface IHandle<TMessage> : IBaseHandle
{
void Handle(TMessage message);
}
场景:
Binding
Handle
方法(使用IHandle
接口(interface))最佳答案
首先,这段代码是多余的:
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("DataSource"));
不建议在通常的属性 setter 中编写任何额外的代码,因为 WPF DP 系统直接访问 DP,而无需使用 setter 或 getter。在 OnDataSourceChanged
方法中引发 PropertyChanged
。
其次,您的控件继承了DependencyObject
,它允许您添加 Dependecny 属性。
更新有可能改变了以前的行为,并且 DP 系统现在在绑定(bind)到控件的依赖属性时不会通过 ProprtyChanged 事件订阅通知,因为不需要它。 DP系统有通知。
这可能是 PropertyChanged
为 null 的原因。
更新
我认为按照您的方式设置 CurrentValue 会导致细微的错误。通常 SetCurrentValue()
用于由于某些内部原因应更改值时。例如。 TextBox
在用户键入文本时使用 SetCurrentValue()
设置其 Text
属性值。这允许保存绑定(bind)。
但是,如果您尝试以编程方式设置绑定(bind),会发生什么情况?
根据您在评论中所说的,您可以尝试:
INotifyPropertyChanged
DependencyObject.InvalidateProperty()
关于c# - PropertyChanged 未附加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15678967/
创建面向.net 4.5.1的winform项目 安装包PropertyChanged.Fody [ImplementPropertyChanged] public class PersonFody
创建面向.net 4.5.1的winform项目 安装包PropertyChanged.Fody [ImplementPropertyChanged] public class PersonFody
有什么方法可以配置 fody 不检查设置为属性的值 - 我遇到值相同的情况并且我想要设置属性,因为我在未调用的属性 setter 中有额外的逻辑。 最佳答案 这显然是在最初问题之后的几年,但供将来引用
在 WPF 项目中,我有一个绑定(bind)到 ViewModel 集合的 ItemsControl。它的 ItemTemplate 包含绑定(bind)到对象集合属性的图像控件。我有一个计时器,它每
我正在为我们的应用程序实现观察者模式 - 目前正在使用 RX 框架。 我目前有一个看起来像这样的例子: Observable.FromEventPattern(Instance.Address, "P
我处于从外部来源获悉某个特定实体已在我当前数据上下文之外更改的情况。我能够找到实体并像这样调用刷新 MyDataContext.Refresh(RefreshMode.OverwriteCurrent
我有一个实现 PropertyChanged 的类。我做了类似的事情来订阅它: p.PropertyChanged += (s, a) => { switch ( a.PropertyNa
Here's一个工作示例: $(document).on("input propertychange", ".myClass", function () { $('#result').appe
在我的 ViewModel 中,我有一个属性,它是模型列表: private List _locations = null; public List Locations { get {
这个问题在这里已经有了答案: Implementing INotifyPropertyChanged - does a better way exist? (34 个回答) 2年前关闭。 当我绑定(b
我希望以一种优雅的方式更新我的 ListView 。 这是我的代码: ObservableCollection tracks = new ObservableCollection(); Track t
我有一个 Silverlight 应用程序,我在其中实现了 MVVM 模式。 在我的应用程序中有一个子窗口,上面有 ComboBox。我将组合框的 ItemsSource 和 SelectedItem
我一直在使用NotifyProperyWeaver,并且注意到它在使用PropertyChanged.Fody的Fody的最新版本中已过时。 我让NotifyProperyWeaver仅编织属性所具有
我目前正在尝试使用更改的 Fody 属性创建一个带有 MVVM 的 WPF 项目。 public static class Model { public
我正在尝试让我的属性更改事件处理程序正常工作,并且我已经使用调试器检查了正在调用 OnPropertyChanged 方法,但它并没有像我期望的那样调用该方法。 public class MainVi
我有以下类结构 class Top : NotifyPropertyChanged { private List innerList; public bool IsInnerTrue
我有以下方法: void ViewModelPropertyChanged(object sender, PropertyChangedEventArgs e) { switch (e.Pro
我遇到这样一种情况,我有几个变量,它们的值相互依赖,如下所示: A 是 B 和 C 的函数B 是 A 和 C 的函数C是A和B的函数 任一值都可以在 UI 上更改。我正在做这样的计算和更改通知: pr
我在 WPF 中有一个可视化控件,它利用了依赖属性。这些属性由字段支持,这些字段是类,有时需要通知所有绑定(bind),当实际包含的类被修改时,属性值已更改。 简单地说: MyDepProp 是 My
我已经实现了自定义 TextBox: public class MyTextBox : TextBox { // ... } 我从 XAML 使用: 并且它绑定(bind)到我的 ViewM
我是一名优秀的程序员,十分优秀!