1

行の ObservableCollection (タイプ MyRow) (行と呼ばれる) があるとします。MyRow には、ObservableCollection (タイプ MyRowContents) (Contents と呼ばれる) を含む一連のプロパティがあります。これは基本的に、その行に含まれるすべてのコンテンツのリストです。MyRowContents には、DisplayContents (文字列) などのいくつかのプロパティもあります。

たとえば... 2 つの行と 3 つの列を持つ DataGrid の場合、データ構造は 2 つの「行」になり、それぞれに 3 つの「コンテンツ」が含まれます。

セルの内容が Rows[i].Contents[j].DisplayContents を表示するには、XAML の DataGrid で何をする必要がありますか?

編集:

こんにちは、最初のメッセージで十分に明確でなくて申し訳ありません。データを動的に表示できるデータ グリッドを作成しようとしています (事前に不明なデータベース テーブルから)。

これをガイドとして使用しました: http://pjgcreations.blogspot.com.au/2012/09/wpf-mvvm-datagrid-column-collection.html - 列を動的に表示できます。

    <DataGrid ItemsSource="{Binding Rows}" AutoGenerateColumns="False" 
              w:DataGridExtension.Columns="{Binding ElementName=LayoutRoot, Path=DataContext.Columns}" />

行データを動的に表示する方法がわかりません。

MyRow は次のとおりです。

public class MyRow
{
    public int UniqueKey { get; set; }
    public ObservableCollection<MyRowContents> Contents { get; set; }
}

MyRowContents は次のとおりです。

public class MyRowContents
{
    public string ColumnName { get; set; } // Do I need this?
    public object DisplayContents { get; set; } // What I want displayed in the grid cell
}

ビュー モデルにパブリック プロパティ ObservableCollection Rows があります。ご覧のとおり、ItemsSource でバインドしているものです。しかし、各 MyRowContents の「DisplayContents」を取得して、グリッド ビューの適切なセルに表示する方法がわかりません。

列名を動的に表示できることを考えると、次の仮定を行うことができます。Contents (MyRow 内) のアイテムの順序は、列の順序と一致します。

ありがとう

4

1 に答える 1

2

まず、RowContent に行 ID を配置する必要があるため、アプリのロジックは次のようになります。

RowContent.cs:

public class RowContent
{
    //public string ColumnName { get; set; } "you dont need this property."

    public int ID;  //You should put row ID here.
    public object DisplayContents { get; set; } "What is this property type, is string or int or custom enum??"
}

RowViewModel.cs :

public class RowViewModel
{
    public ObservableCollection<MyRowContents> Contents { get; set; }
}

Collection を Window.DataContext に配置して、DataGrid にバインドできるようにする必要があります。

MainWindow.xaml.cs :

public partial class MainWindow : Window
{
    private RowViewModel rvm = new RowViewModel(); //Here i have made new instance of RowViewModel, in your case you have to put your ViewModel instead of "new RowViewModel();";

    public MainWindow()
    {
        InitializeComponent();

        DataContext = rvm; // this is very important step.
    }
}

最後のステップはウィンドウ XAML にあります。

MainWindow.xaml :

<DataGrid ItemsSource="{Binding Path=Contents}" AutoGenerateColumns="false">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Row ID" Binding="{Binding Path=ID,UpdateSourceTrigger=PropertyChanged}"/>
        <DataGridTextColumn Header="your row header" Binding="{Binding Path=DisplayContents,UpdateSourceTrigger=PropertyChanged}"/>
    </DataGrid.Columns>
</DataGrid>

DataGridColumn には 5 つのタイプがあり、DisplayContents プロパティのタイプに応じて適切なタイプを選択する必要があります。

于 2012-11-25T11:17:15.503 に答える