C# 데이터 바인딩은 WPF를 업데이트하지 않습니다
-
21-08-2019 - |
문제
XAML이 아닌 C# 코드에서 데이터 바인딩을하려고합니다. 표현식 블렌드 2에서 생성 된 XAML 바인딩 내 CLR 객체에 제대로 작동합니다. 내 C# 구현은 응용 프로그램이 시작될 때만 업데이트되며, 이후 CLR의 후속 변경은 내 레이블 컨텐츠를 업데이트하지 않습니다.
작동하는 XAML 바인딩은 다음과 같습니다. 먼저 객체 dataprovider가 내 창에 만들어집니다.
<ObjectDataProvider x:Key="PhoneServiceDS"
ObjectType="{x:Type kudu:PhoneService}" d:IsDataSource="True"/>
그리고 레이블 내용 바인딩 :
<Label x:Name="DisplayName" Content="{Binding
Path=MyAccountService.Accounts[0].DisplayName, Mode=OneWay,
Source={StaticResource PhoneServiceDS}}"/>
잘 작동합니다. 그러나 우리는이 설정을 C#로 원하여 XAML (예 : 새 스킨)을 독립적으로 변경할 수 있습니다. 다음과 같이 C#을 작동시킵니다.
Binding displayNameBinding = new Binding();
displayNameBinding.Source =
PhoneService.MyAccountService.Accounts[0].DisplayName;
displayNameBinding.Mode = BindingMode.OneWay;
this.DisplayName.SetBinding(Label.ContentProperty, displayNameBinding);
이것은 initializecomponent () 다음에 내 메인 위로 안에 있습니다.
왜 이것이 스타트 업에서만 작동하는지 통찰력이 있습니까?
해결책
C# 버전은 XAML 버전과 일치하지 않습니다. ObjectDataprovider에 익숙하지는 않지만 마크 업의 코드 버전을 작성하는 것이 가능합니다.
다음과 같은 것을 시도하십시오.
Binding displayNameBinding = new Binding( "MyAccountService.Accounts[0].DisplayName" );
displayNameBinding.Source = new ObjectDataProvider { ObjectType = typeof(PhoneService), IsDataSource = true };
displayNameBinding.Mode = BindingMode.OneWay;
this.DisplayName.SetBinding(Label.ContentProperty, displayNameBinding);
다른 팁
사전 코드에서는 소스와 경로를 혼동했습니다.
Binding displayNameBinding = new Binding();
displayNameBinding.Source = PhoneService;
displayNameBinding.Path = "MyAccountService.Accounts[0].DisplayName";
displayNameBinding.Mode = BindingMode.OneWay;
this.DisplayName.SetBinding(Label.ContentProperty, displayNameBinding);
(폰 서비스가 객체 인스턴스라고 생각합니다.
메모리에서, 당신은 경로를 생성자에게 인수로 전달할 수 있습니다.
이 내부로드 된 이벤트를 생성자 대신 작성하십시오. DisplayName 속성 세터에 트리거 된 InotifyPropertyChanged를 암시하기를 바랍니다.
제휴하지 않습니다 StackOverflow