3

誰かが次のことを試みたのか、それをどうやってやるのか考えているのだろうか。

アイテムのObservableCollectionにバインドされているWPFToolkitDataGridがあります。そのため、DataGridは、ObservableCollection内の行と、DataGridに対して定義した列と同じ数で表示れます。それはすべて良いことです。私が今必要としているのは、同じデータの別のビューを提供することです。代わりに、DataGridはObservableCollection内の同じ数のセルで表示されます。

たとえば、私のObservableCollectionには100個のアイテムが含まれているとします。元のシナリオでは、100行1列のDataGridが示されていました。変更されたシナリオでは、10行10列で表示する必要があります。各セルには、元の表現にあった値が表示されます。つまり、1DObservableCollectionを2DObservableCollectionに変換し、DataGridに表示する必要があります。コードビハインドでプログラムでそれを行う方法を知っていますが、XAMLで行うことはできますか?

誰かがこれにひびが入る可能性がある場合に備えて、問題を少し単純化しましょう。以下のXAMLは次のことを行います。

* Defines an XmlDataProvider just for dummy data
* Creates a DataGrid with 10 columns
      o each column is a DataGridTemplateColumn using the same CellTemplate
* The CellTemplate is a simple TextBlock bound to an XML element

以下のXAMLを実行すると、DataGridは5行(各本に1つ)、および同じコンテンツを持つ10列(すべて本のタイトルを表示)で終わることがわかります。ただし、データセットが異なっていても、私が達成しようとしているのは、この場合、各本のタイトルが行1の単一のセルに表示され、セル0〜4を占有し、セル5〜9には何もありません。次に、さらにデータを追加し、XMLデータソースに12冊の本がある場合、行1は完全に埋められ(最初の10タイトルをカバーするセル)、行2は最初の2つのセルが埋められます。

私のシナリオは主にXAMLで実行できますか、それともコードビハインドでの作業に辞任する必要がありますか?

任意のガイダンスをいただければ幸いです。本当にありがとう!

<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:custom="http://schemas.microsoft.com/wpf/2008/toolkit"
mc:Ignorable="d"
x:Name="UserControl"
d:DesignWidth="600" d:DesignHeight="400"  >
<UserControl.Resources>
    <XmlDataProvider x:Key="InventoryData" XPath="Inventory/Books">
        <x:XData>
            <Inventory xmlns="">
                <Books>
                    <Book ISBN="0-7356-0562-9" Stock="in" Number="9">
                        <Title>XML in Action</Title>
                        <Summary>XML Web Technology</Summary>
                    </Book>
                    <Book ISBN="0-7356-1370-2" Stock="in" Number="8">
                        <Title>Programming Microsoft Windows With C#</Title>
                        <Summary>C# Programming using the .NET Framework</Summary>
                    </Book>
                    <Book ISBN="0-7356-1288-9" Stock="out" Number="7">
                        <Title>Inside C#</Title>
                        <Summary>C# Language Programming</Summary>
                    </Book>
                    <Book ISBN="0-7356-1377-X" Stock="in" Number="5">
                        <Title>Introducing Microsoft .NET</Title>
                        <Summary>Overview of .NET Technology</Summary>
                    </Book>
                    <Book ISBN="0-7356-1448-2" Stock="out" Number="4">
                        <Title>Microsoft C# Language Specifications</Title>
                        <Summary>The C# language definition</Summary>
                    </Book>
                </Books>
                <CDs>
                    <CD Stock="in" Number="3">
                        <Title>Classical Collection</Title>
                        <Summary>Classical Music</Summary>
                    </CD>
                    <CD Stock="out" Number="9">
                        <Title>Jazz Collection</Title>
                        <Summary>Jazz Music</Summary>
                    </CD>
                </CDs>
            </Inventory>
        </x:XData>
    </XmlDataProvider>

    <DataTemplate x:Key="GridCellTemplate">
        <TextBlock>
            <TextBlock.Text>
                <Binding XPath="Title"/>
            </TextBlock.Text>
        </TextBlock>
    </DataTemplate>

</UserControl.Resources>

<Grid x:Name="LayoutRoot">
    <custom:DataGrid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsSynchronizedWithCurrentItem="True"
    Background="{DynamicResource WindowBackgroundBrush}" HeadersVisibility="All" RowDetailsVisibilityMode="Collapsed"
    SelectionUnit="CellOrRowHeader" CanUserResizeRows="False" GridLinesVisibility="None" RowHeaderWidth="35" AutoGenerateColumns="False"
    CanUserReorderColumns="False" CanUserSortColumns="False">
        <custom:DataGrid.Columns>
            <custom:DataGridTemplateColumn CellTemplate="{StaticResource GridCellTemplate}" Header="01" />
            <custom:DataGridTemplateColumn CellTemplate="{StaticResource GridCellTemplate}" Header="02" />
            <custom:DataGridTemplateColumn CellTemplate="{StaticResource GridCellTemplate}" Header="03" />
            <custom:DataGridTemplateColumn CellTemplate="{StaticResource GridCellTemplate}" Header="04" />
            <custom:DataGridTemplateColumn CellTemplate="{StaticResource GridCellTemplate}" Header="05" />
            <custom:DataGridTemplateColumn CellTemplate="{StaticResource GridCellTemplate}" Header="06" />
            <custom:DataGridTemplateColumn CellTemplate="{StaticResource GridCellTemplate}" Header="07" />
            <custom:DataGridTemplateColumn CellTemplate="{StaticResource GridCellTemplate}" Header="08" />
            <custom:DataGridTemplateColumn CellTemplate="{StaticResource GridCellTemplate}" Header="09" />
            <custom:DataGridTemplateColumn CellTemplate="{StaticResource GridCellTemplate}" Header="10" />
        </custom:DataGrid.Columns>
        <custom:DataGrid.ItemsSource>
            <Binding Source="{StaticResource InventoryData}" XPath="Book"/>
        </custom:DataGrid.ItemsSource>
    </custom:DataGrid>
</Grid>

4

1 に答える 1

2

したがって、質問を簡単に言い換えると、オブジェクトのコレクションがあり、それらを10行で水平に表示する必要があります。10を超える場合、余分なアイテムは次の行に折り返されます(リフロー)。

これを非常に簡単に行う方法は次のとおりです。

DataGridを使用しないでください。これは基本的に、列にそのオブジェクトのさまざまなデータが表示される行にオブジェクト1オブジェクトを表示する場合のみです。

代わりに、ListBoxまたはListViewを使用してItemsPanel、次のように新しいものを指定します(データテンプレートを使用して複雑なオブジェクトを表示します)。

<ListBox ItemsSource="{Binding SomeCollectionOfObjects}">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="10"/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

VirtualizingStackPanelこれにより、ListBoxがアイテムを配置するために使用するデフォルトが。に置き換えられますUniformGrid。ユニフォームグリッドを使用する理由は、グリッドに必要な列や行の数を指定できるためです。パネルは、表示領域をリストボックスの項目間で均等に分割しますが、(必要に応じて)10列になります。

列/行の数を固定したくない場合は、代わりにWrapPanel、できるだけ多くのオブジェクトを1つの行に収めて、次の行inline-blockに折り返す、htmlの要素のようなもの、または左寄せのテキストを使用できます。 。

最後にもう1つ、先ほど説明した3つのパネルのそれぞれで、(UniformGridとWrapPanelのデフォルト)または(VirtualizingStackPanelとStackPanelのデフォルト)のOrientationいずれかに設定できることを覚えておいてください。HorizontalVertical

さらに、カスタムアイテムレイアウト用に独自のパネルを作成することもできます(たとえば、アイテムを円形に配置するなど)。

于 2010-03-22T10:56:41.497 に答える