3

私はWPFを初めて使用します。を使用して SQL データベースのデータを表示するページがありますL2S。は、特定の領域で選択可能なすべてのオプションを含む をL2S返します。DataTableデータベースから返されるすべての行は である必要があり、checkboxそれらのチェックボックスをstackpanel.

へのデータバインディングを見ていStackPanelますか?それは間違っているように感じます... をループしてDataTable各行のチェックボックス項目を作成し、実行時にそれらを に追加する必要があると推測していましたStackPanel。これは正しいです?返品DataTableは私の問題の一部ですか?

StackPanelプロパティがあることがわかりDataContextましたが、各アイテムを にすることがわからないため、設定することはできませんcheckbox。正しいですか?

4

2 に答える 2

8

おそらく、ItemsControl が必要です。これにより、指定された DataTemplate を使用して一連のアイテムを提示できます。これは、ItemsControl のインラインで行うことができます。

   <ItemsControl ItemsSource="{Binding MyCollectionOfItems}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>  

または、リソースからデータ テンプレートを明示的に参照する...もっと似たようなもの:

    <!-- In some parent resource section -->
    <DataTemplate x:Key="MyDataTemplateName">
        <CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/>
    </DataTemplate>

    <!-- ... -->

    <ItemsControl ItemsSource="{Binding MyCollectionOfItems}" ItemTemplate="{StaticResource MyDataTemplateName}">
    </ItemsControl>

または、バインドされたクラスのルック アンド フィールを定義する DataTemplate を定義できます。(Linq-to-SQL が匿名型に射影している場合、これはオプションではないことに注意してください)。

        <!-- In some parent resource section -->
        <DataTemplate DataType="{x:Type MyBoundClass}">
            <CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/>
        </DataTemplate>

    <!-- ... -->

    <ItemsControl ItemsSource="{Binding MyCollectionOfItems}">
    </ItemsControl>

WPF は、コレクション内の各項目の DataType に一致する DataTemplate を探します。これは、異なるプレゼンテーションを必要とする異種コレクションをバインドするのに非常に役立つことに注意してください。

Stackpanel の DataContext をバインドすることはできますが、データの要素ごとにテンプレートを繰り返すことに関する固有のロジックはありません。子コントロールと含まれる{Binding ...}ステートメントのコンテキストを提供するだけです。繰り返しデータを処理するすべてのコントロールは、ItemsControl から派生し、ItemsSource プロパティを通じてデータを取得します。

于 2010-03-11T15:00:32.957 に答える
3

Ben Von Handorf の回答に加えて、ItemsControl がその要素を配置する方法をItemsPanel. 例えば:

<ListBox ItemsSource="{Binding MyCollection}">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

これにより、ListBox はアイテムを垂直方向ではなく水平方向に配置します。WrapPanelアイテムをテキストのように「流れる」ようにしたい場合 (またはspanhtml を知っている場合)を使用することもできます。WrapPanel は、水平方向または垂直方向にも配置できます。(ただし、アイテムの大規模なコレクションには WrapPanel を使用しないようにしてください。これは仮想化されておらず、大きな遅延が発生するためです。)

独自のカスタム パネルを作成して置き換えることもできます。アイテムをランダムに配置するパネルを作成し、それを ListBox に使用したことがあります。バインドされたコレクションの各アイテムは、ListBox 内のランダムな位置に表示されました。レイアウトが更新されるたびに、アイテムの位置が変わりました。

于 2010-03-11T15:18:26.027 に答える