2

1行だけのグリッドがあります。グリッドのデータ コンテキストによって列の数を決定したいと考えています。

たとえば、"Fred"、"Joe"、"Anne" を返す「Names」という名前の ObservableCollection プロパティで公開されている名前のリストがある場合、グリッドに 3 つの列が必要で、それぞれにテキスト ボックスがバインドされます。名前。

これまでの私の考え:

1) コード ビハインドで手動でグリッドを構築し、ObservableCollection が変更されたときにグリッドを再構築します。少しぎこちなく、WPFのやり方ではないように思えたので、私はこれを使いませんでした。

2) Grid の ColumnDefinitions プロパティを使用してバインディングを作成します。これはより正しいように見えましたが、Grid には ColumnDefinition の依存関係プロパティがありません。

4

3 に答える 3

3

グリッドをその場で変更することが最善の策ではないと思います。別の解決策があります。ListBoxを使用できますが、ItemsPanelを選択した別のパネルに置き換えます。ListBoxのデフォルトのItemsPanelは、OrientationがVerticalに設定されたVirtualizingStackPanelです。アイテムを水平に表示したいので、OrientationをHorizo​​ntalに設定したVirtualizingStackPanelに置き換えることができます。もちろん、ItemsTemplateやその他の適切なものを変更できます。

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

以前にもこのメソッドを使用して、アイテムを水平方向に表示するListBoxを作成しましたが、WrapPanelを使用して、行のスペースがなくなると次の行に折り返します。独自のカスタムパネルを作成して置き換えることもできます。私はかつて、アイテムをランダムにレイアウトするパネルを作成し、それをリストボックスに使用しました。バインドされたコレクションの各アイテムは、リストボックス内のランダムな位置に表示されました。レイアウトが更新されるたびに、アイテムは新しい位置になりました。

于 2010-01-31T16:10:55.843 に答える
3

それがDataGridの場合、AutoGenerateColumnsプロパティがこれを行います。DataGridTemplateColumnを使用すると、テキストだけでなくテキスト ボックス コントロールを配置できます。AutoGeneratingColumnにアタッチされたイベントを提供し、AutoGeneratingColumnEventArgs (こんにちは、マイクロソフト、これはカーペル トンネルの呼び出しです) で、Column プロパティをテキスト ボックスのあるテンプレート列に設定する必要があります。

ObservableCollection の方法の方が簡単だと思います;-P.

于 2009-08-03T02:19:02.053 に答える
2

各列ではなく各行に名前を付けることができる場合は、GridView Viewプロパティを含むListViewと、バインドされたテキストボックスであるカスタム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が最善の策です。

于 2009-07-31T19:29:52.703 に答える