0

特定のコードに関する質問ではありません。データ バインディングがDataTemplate. これは単なるコード ブロックの例です。3 つの属性を持つクラスを定義しましたClient(これらの属性の目的は質問とは関係ありません)。

public class Client
{
    public bool Powered { get; set; }
    public bool clientAlive { get; set; }
    public bool updaterAlive { get; set; }
}

ListViewクライアントのリストを使用してデータを入力します。

List<Client> clientList = new List<Client>();
//populate the list from JSON url, code omitted
listView1.ItemsSource = clientList;

ListView に項目を表示するためのテンプレートを保持する XAML コードのブロックを次に示します。

<ListView.ItemTemplate>
    <DataTemplate>
         <WrapPanel>
             <TextBlock Text="Powered: " FontWeight="Bold" />
             <TextBlock Text="{Binding Powered}" />
             <TextBlock Text=", " />
             <TextBlock Text="clientAlive: " FontWeight="Bold" />
             <TextBlock Text="{Binding clientAlive}" />
             <TextBlock Text=", " />
             <TextBlock Text="updaterAlive: " FontWeight="Bold" />
             <TextBlock Text="{Binding updaterAlive}" />
         </WrapPanel>
    </DataTemplate>
</ListView.ItemTemplate>

コードは正常に実行され、すべてが期待どおりに表示されます。WPF でデータ バインディングがどのように機能するかを誰かが説明できるかどうか疑問に思っていました。私に関する限り、XAML にはClientクラスを参照するものは何もなく、バインディングが指定するプロパティを表示することを XAML がどのように認識しているかについて混乱しています。Text = "{Binding = Powered}"リストに入力する項目タイプ内のバインディングに一致する属性を探すだけですか?

4

2 に答える 2

1

Text = "{Binding = Powered}" は、リストに入力する項目タイプ内のバインディングに一致する属性を探すだけですか?

基本的に、はい。リストに入力した項目にその属性がない場合は、バインド エラーが表示されます (デバッグ中にコンソールを確認してください)。

DataTemplateコレクション内のオブジェクトの特定のタイプに応じて適用される複数のテンプレートを持つことができるタイプを に指定することもできます。

于 2013-05-28T20:19:09.540 に答える
0

コレクションがリストビューにバインドされると、各リスト項目コンテナーが生成され、Content が Client オブジェクトに設定されます。したがって、データ テンプレート内に存在するビジュアルには、データ コンテキストとして Client オブジェクトがあります。

行 "{Binding Powered}" は、datacontext を検索し、"Powered" という名前のプロパティを見つけて、その値を解決します。「Powered」という単語を削除して「{Binding}」のままにしておくだけで、WPF は datacontext オブジェクトの完全修飾名を表示します。

于 2013-05-29T06:56:26.730 に答える