WPF グリッド データ バインディング
-
06-07-2019 - |
質問
1行だけのグリッドがあります。列の量をグリッドのデータコンテキストによって決定したいと考えています。
たとえば、「Fred」、「Joe」、「Anne」を返す「Names」という名前の ObservableCollection プロパティで公開されている名前のリストがある場合、グリッド内に 3 つの列があり、各列にテキスト ボックスがバインドされているとします。名前。
これまでの私の考え:
1) コードビハインドで手動でグリッドを構築し、ObservableCollection が変更されたときに再構築します。これは少しぎこちなく、WPF のやり方ではないようだったので、私はこれを採用しませんでした。
2) グリッドの ColumnDefinitions プロパティを使用してバインディングを作成します。これはより正しいように思えますが、グリッドには ColumnDefinition の依存関係プロパティがありません。
解決
グリッドをその場で変更することが最善の策だとは思いません。ここに別の解決策があります。ListBox を使用することもできますが、 アイテムパネル お好みの別のパネルを使用してください。ListBox のデフォルトの ItemsPanel は、方向が垂直に設定された VirtualizingStackPanel です。項目を水平に表示したいので、Orientation を に設定した VirtualizingStackPanel に置き換えることができます。 水平. 。もちろん、ItemsTemplate やその他のものを必要に応じて変更できます。
<ListBox ItemsSource="{Binding MyCollection}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
また、以前にこのメソッドを使用して、WrapPanel を使用して項目を水平に表示するが、行上のスペースがなくなると次の行に折り返す ListBox を作成しました。独自のカスタム パネルを作成して置き換えることもできます。以前、アイテムをランダムに配置するパネルを作成し、それを ListBox に使用しました。バインドされたコレクション内の各項目は、ListBox 内のランダムな位置に表示されました。レイアウトが更新されるたびに、項目は新しい位置を取得します。
他のヒント
の場合DataGrid 、 AutoGenerateColumns プロパティがこれを行います。 DataGridTemplateColumn 、そこにテキストだけでなくテキストボックスコントロールを配置できます。 AutoGeneratingColumn および AutoGeneratingColumnEventArgs (こんにちは、Microsoft、これは心皮トンネル呼び出し)、テキストボックスでColumnプロパティをテンプレート列に設定します。
ObservableCollectionの方が簡単だと思います;-P。
各列ではなく各行の名前を受け入れることができる場合、ListViewをGridView Viewプロパティと共に使用し、バインドされたテキストボックスであるカスタムCellTemplateを使用する必要があります。このようなもの:
<ListView ItemsSource="{Binding Names}">
<ListView.View>
<GridView>
<GridViewColumn>
<GridViewColumn.CellTemplate>
<!-- Your textbox goes in a DataTemplate here -->
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
解決策#2は、残念ながらXAMLでは不可能です。解決策#1は、それぞれの名前をそれぞれの列に含める必要がある場合の最善策です。