문제

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를 암시하기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top