종속성 속성을 활용하는 WPF에서 시각적 컨트롤이 있습니다. 이러한 속성은 클래스 인 필드에 의해 뒷받침되며 실제로 포함 된 클래스가 수정되었을 때 속성의 값이 변경된 경우 모든 바인딩에 알릴 필요가있는 경우가 있습니다.PropertyChanged가 첨부되지 않았습니다.
는 간단히 말했다 :
- MyDepProp 유형의 MyClass에이다;
- MyClass의 내용은 컨트롤의 내부 작업으로 인해 변경됩니다.
- MyDepProp이 변경되어 MyClass의 변경 사항을 반영 할 수 있도록 모든 사람에게 알려 드리고 싶습니다.
MSDN에 따르면 종속성 속성을 처음 사용할 때 PropertyChanged가 DependencyObject에 연결됩니다. 그러나 Visual Studio 2010을 설치 한 후에는 Visual Studio 2012를 설치 한 후 작동이 중지되었습니다. DP를 사용 했는데도 (예 : 바인딩이 첨부되어 있음) PropertyChanged는 null이며 아무에게도 변경 사실을 알릴 수 없습니다. 것 같다 있도록
나는 여전히
내가 올바르게하여 PropertyChanged 이벤트를 사용하십니까 VS 2012와 함께 업데이트 된 깨진 프레임 워크의 문제 것을, 비주얼 스튜디오 2010 컴파일러 툴킷을 사용? 아니면 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 인터페이스 :
public interface IBaseHandle { }
public interface IHandle<TMessage> : IBaseHandle
{
void Handle(TMessage message);
}
시나리오 :
- 데이터 소스 는
Binding
- 사람을 사용하여 다른 속성 바인딩, 데이터 소스의 변화를 그래서 정보를하여 PropertyChanged가 널인지의 여부,
- 핸들 검사합니다 (
IHandle
인터페이스를 사용하여) 제어Handle
메소드를 호출하지 않고 그 것이다 전파됩니다.
당신이 몇 가지 코드를 보여줄 수 전화
에 대한
INotifyPropertyChanged
을 구현, 모든이가 힘들 수도 ... 내 PC에서 VS2012에서 – Peter을 잘 작동, 그것은 실제로 거대한의 일부 프로젝트와 많은 곳에서이 메커니즘이 작동합니다. 이것이 내가 개념 실현 코드를 쉽게 제공 할 수없는 이유입니다. 그렇게 할 수 있다면 여기에 게시 할 것입니다. 그래서 내가이 질문에 너무 어려움을 겪었다 고 묻는 이유는 무엇입니까? – Spook
현재 문제없이 VS2012에서 DP를 사용하고 있습니다. datacontext의 한 인스턴스가 있는지 확인하십시오. 그렇지 않으면 잘못된 인스턴스를 업데이트 할 수 있습니다. RaisePropertyChanged 이벤트가 속성과 동일한 이름으로 호출되는지 확인하십시오. 코드가 없다면 그것들이 제가 확인한 첫 번째 것이 될 것입니다. – keyboardP