4

XAML ではなく、C# コード ビハインドでデータ バインディングを実行しようとしています。Expression Blend 2 で作成した CLR オブジェクトへの XAML バインディングは正常に機能します。私の C# 実装は、アプリケーションが開始されたときにのみ更新され、その後 CLR に変更を加えても、ラベルの内容は更新されません。

これが実際の XAML バインディングです。最初に、ObjectDataProvider が Window.Resources で作成されます。

<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(); の後の MainWindow 内にあります。

これが起動時にのみ機能する理由は何ですか?

4

3 に答える 3

3

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);
于 2008-12-10T18:58:55.723 に答える
1

元のコードでは、ソースとパスを混同しています。

     Binding displayNameBinding = new Binding();
     displayNameBinding.Source = PhoneService;
     displayNameBinding.Path = "MyAccountService.Accounts[0].DisplayName";
     displayNameBinding.Mode = BindingMode.OneWay;
     this.DisplayName.SetBinding(Label.ContentProperty, displayNameBinding);

(私は PhoneService がオブジェクト インスタンスであると想定しています。

メモリから、パスを引数としてコンストラクターに渡すことができます。

于 2009-01-03T06:44:35.977 に答える
0

これを Constructor の代わりに Loaded イベント内に記述します。DisplayName プロパティ セッターでトリガーされる INotifyPropertyChanged を実装したことを願っていますか?

于 2008-12-10T18:20:39.623 に答える