PropertyChanged 이벤트는 항상 null입니다.
다음(약어) xaml이 있습니다.
<TextBlock Text="{Binding Path=statusMsg, UpdateSourceTrigger=PropertyChanged}"/>
싱글톤 클래스가 있습니다.
public class StatusMessage : INotifyPropertyChanged
{
private static StatusMessage instance = new StatusMessage();
private StatusMessage() { }
public static StatusMessage GetInstance()
{
return instance;
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string status)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(status));
}
}
private string statusMessage;
public string statusMsg
{
get
{
return statusMessage;
}
set
{
statusMessage = value;
OnPropertyChanged("statusMsg");
}
}
}
그리고 내 메인 윈도우 컨스트럭터:
StatusMessage testMessage = StatusMessage.GetInstance();
testMessage.statusMsg = "This is a test msg";
테스트 메시지를 표시하는 텍스트 블록을 가져올 수 없습니다.디버깅을 통해 코드를 모니터링하면 Property Changed는 항상 늘이 됩니다.좋은 생각 있어요?
고마워 제롬!Data Context를 설정하면 정상적으로 동작합니다.테스트를 위해 메인 윈도 컨스트럭터에 다음 항목을 추가했습니다.
this.DataContext = testMessage;
오늘 이걸 우연히 만나서 시간을 허비했고, 결국 알아냈죠.이것이 당신과 다른 사람들의 시간을 절약하는 데 도움이 되기를 바랍니다.
이벤트에 가입자가 없고 단순히 이벤트를 다음과 같이 선언한 경우:
public event EventHandler SomeEventHappened;
그러면 null 참조가 필요합니다.이 문제를 해결하려면 다음과 같이 선언합니다.
public event EventHandler SomeEventHappened = delegate { };
이렇게 하면 다음과 같이 호출할 때 null 참조가 되지 않습니다.
SomeEventHappened()
다른 패턴은 {} 위임으로 초기화하지 않고 대신 null을 확인하는 것입니다.
var eventToRaise = SomeEventHappened;
if( eventToRaise != null )
{
SomeEventHappened()
}
OnPropertyChanged 문자열은 대소문자를 구분하므로 속성 이름과 정확히 일치해야 합니다.
변경해 보다
OnPropertyChanged("StatusMsg");
로.
OnPropertyChanged("statusMsg");
업데이트: 또한 StatusMsg(대문자 'S')에 바인딩되어 있다는 것을 알게 되었습니다.그래서 컨트롤이 속성에 바인딩되어 있지 않은 것도 업데이트되지 않은 이유입니다.
만약을 위해:나도 비슷한 문제가 있었지만 나의 실수는 inotify를 시행한 수업이었다.Property Changed는 비공개입니다.공개하면서 내 사건이 해결됐어
제 경우엔 이렇게 하면 효과가 있습니다.
public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
InitializeComponent();
this.DataContext = this; // this row fixed everything
}
****
Some code here with properties etc
***
}
또 다른 점 - PropertyChanged가 null인 경우 속성을 UI 필드에 직접 할당하는 대신 개체를 DataContext에 바인드한 다음 경로를 설정해야 합니다.
컨트롤의 데이터 바인딩 속성에 기존 데이터를 할당한 경우 PropertyChanged 이벤트가 null인 것도 확인했습니다.
<TextBlock Name="CarTireStatus" Text="{Binding TireStatus}" >Bad Text!</TextBlock>
이 기능은 다음과 같습니다.
<TextBlock Name="CarTireStatus" Text="{Binding TireStatus}" ></TextBlock>
PropertyChanged 이벤트 개체를 null로 관찰할 때 확인해야 할 항목이 몇 가지 있습니다.
이벤트를 발생시킬 때 인수로 전달된 속성 이름이 실제로 대상 속성의 이름과 일치하는지 확인하십시오.
바인딩하는 속성이 포함된 개체의 인스턴스를 하나만 사용하고 있는지 확인하십시오.
항목 2의 경우 바인딩되는 속성을 숨기는 개체의 클래스 생성자에 중단점을 배치하기만 하면 됩니다.중단점이 여러 번 트리거되면 문제가 발생하여 실행 시 XAML을 통해 호출되는 하나의 인스턴스로만 개체의 인스턴스 수를 해결해야 합니다.
따라서 이 클래스를 싱글톤 패턴으로 구현하여 런타임에 개체의 인스턴스를 하나만 보장할 수 있도록 하는 것이 좋습니다.
스토리를 완성하기 위해 바인딩된 속성이 스태틱하고 PropertyChanged 이벤트가 스태틱하지 않은 경우에도 늘이 됩니다.간단한 수정은 다음과 같이 다른 스태틱이벤트를 선언하는 것입니다.
public event PropertyChangedEventHandler PropertyChanged;
public static event PropertyChangedEventHandler StaticPropertyChanged;
★★PropertyChanged?.Invoke()
★★★★★★★★★★★★★★★★★」StaticPropertyChanged?.Invoke()
대상 속성이 정적인지 여부에 따라 달라집니다.
비슷한 문제가 있었습니다만, 위의 어느 해결책도 도움이 되지 않았습니다.필요한 것은 빌드된 c# Propertychanged를 사용하는 것뿐입니다.이전에 propertyChanged(우연히 변경)를 구현했는데 아무것도 표시되지 않았습니다.
모든 지시에 따라 속성 이름이 올바른지 확인하고 새 값이 올바르게 할당되었는지 확인하는 경우 단일톤을 사용하여 뷰 모델의 인스턴스 하나를 보증하는 것입니다.UI에서 DataContext를 성공적으로 할당했습니다. 시각적 트리가 완료된 후 속성 갱신을 강제하는 모든 작업이 완료되었는지 확인하십시오. 즉, 창의 Loaded 이벤트가 아니라 속성 새로 고침을 버튼으로 이동합니다.같은 문제가 있었기 때문에 이 말을 하게 되었습니다.Infragistics NetAdvantage 리본 창의 Loaded 이벤트에서 뷰 모델 데이터 속성을 새로 고쳤을 때 PropertyChanged 이벤트가 항상 null이었습니다.
언급URL : https://stackoverflow.com/questions/1512627/propertychanged-event-always-null
'source' 카테고리의 다른 글
브랜치에서 커밋을 삭제하려면 어떻게 해야 합니까? (0) | 2023.04.19 |
---|---|
부호화를 수동으로 지정하지 않고 C# 내의 문자열을 일관된 바이트 형식으로 표시하려면 어떻게 해야 합니까? (0) | 2023.04.19 |
마우스 커서로 WPF 창을 최대화하려면 어떻게 해야 합니까? (0) | 2023.04.19 |
WPF의 페이지 로드 시 콤보 상자에 기본 텍스트 "--Select Team --"을 표시하는 방법 (0) | 2023.04.19 |
한 열에서 구별 선택 (0) | 2023.04.19 |