0

「Person」タイプのオブジェクトのObservablecollectionをリストボックスにバインドするWindowsWPFアプリケーションがあります。人物はテンプレートを介して表示され、このテンプレートは各人物の「エキスパンダー」を生成します(つまり、「Mr.Xの詳細を参照」)。エクスパンションでは、バックグラウンドで何かを実行したい(したがって、イベントハンドラー「Expander_Expanded」を追加しますが、どのエクスパンダーが展開されたかを記憶するプログラムも必要です。つまり、人の「名前」をに渡します。イベント。似たような質問をいくつか見つけましたが、答えがよくわかりませんでした...

また、言語アーキテクチャに精通している人が、言語が次の最も論理的な解決策を許可しない理由を説明できるかもしれません。人のクラスにプロパティを追加する

public ExpanderName {get{return "Expander_"+this.Name;}}

次に、エキスパンダーの名前をこれにバインドします。

<Expander Name="{Binding ExpanderName}" Expanded="Expander_PersonDetails">

次に、「sender.name」から復元することで、イベントハンドラーで展開された人の名前にアクセスできます。コンパイラーは、UIcontrol要素の「名前」をバインドできないと言っています。なんで?

前もって感謝します!

4

1 に答える 1

1

Nameはバインド可能なプロパティではありません。コンパイラがコードビハインドでアクセスする適切なオブジェクトを生成できるように、コンパイル時に知る必要があります。

使用できるのは汎用のTagプロパティです。必要なものをバインドして、コードでアクセスできます。これを試して:

<Expander Tag="{Binding ExpanderName}" Expanded="Expander_PersonDetails">

void Expander_PersonDetail(object sender, RoutedEventArgs args)
{
  var expander = (Expander)sender;
  string expanderName = (string)expander.Tag;
}

より良い解決策は、Expander.IsExpandedプロパティをPersonクラスのフィールドに直接バインドすることです。これにより、常に正しい状態が正しいオブジェクトに格納され、処理がはるかに簡単になります。

于 2012-09-11T12:32:31.147 に答える