2

私は DataGrids を使用していますが、表示する必要がある情報によって列の数が異なるため、データのバインドに苦労しています。

したがって、私がやろうとしたことは、ある時点で必要なすべての列と行を含むオブジェクトを作成し、このオブジェクトをItemsSourceプロパティにバインドすることです。私は WindowsForms で DataGridViews を使用してきたので、次のようなことを念頭に置いています。

DataTable myTable = new DataTable();

DataColumn col01 = new DataColumn("col 01");
myTable.Columns.Add(col01);
DataColumn col02 = new DataColumn("col 02");
myTable.Columns.Add(col02);

DataRow row = myTable.NewRow();
row[0] = "data01";
row[1] = "data02";
myTable.Rows.Add(row);

row = myTable.NewRow();
row[0] = "data01";
row[1] = "data02";
myTable.Rows.Add(row);

しかし、たとえば、いくつかの列を DataGridComboBoxColumns にする必要があるため、WPF で同じことを行う方法を見つけることができませんでした。

実際、私はこのサイトでそれに関する多くの投稿を読みましたが、どれも役に立ちませんでした. 私は本当に迷っています。

誰でも私を助けることができますか?この最終的なオブジェクトを DataGrid の ItemsSource プロパティにバインドするために、DataGridTextColumns または `DataGridComboBoxColumns などを含むテーブルを作成できる必要があります。

誰かが私を助けてくれることを願っています。

4

3 に答える 3

6

さて、あなたのニーズに似た例を挙げてみましょう

このクラスを使用すると仮定しましょう:

public class MyObject
{
   public int MyID;
   public string MyString;
   public ICommand MyCommand;
}

そしてDataGrid、ID のリストを表示し、2 番目の列としてコンテンツとしてButtonプロパティを持つ a を表示します。これをクリックすると、必要に応じて新しいウィンドウで開く が起動します。MyStringICommand MyCommand

ビュー側に必要なものは次のとおりです。

    <DataGrid ItemsSource="{Binding MyList}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="ID" Binding="{Binding MyID}" />
            <DataGridTemplateColumn Header="Buttons">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="{Binding MyString}" Command="{Binding MyCommand}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

これにより、 「MyList」という名前のDataGridすべてのコンテンツが表示され、前に定義した 2 つの列が表示されます。IEnumerable<MyObject>

コマンドを定義する必要がある場合。まず、MVVM へのこの紹介リンクをRelayCommand読んで、クラスを受講することをお勧めします (これは、問題に使用するものです)。

したがって、ViewModelを定義するMyListで、いくつかの便利なオブジェクトを定義する方法を次に示します。

public ObservableCollection<MyObject> MyList { get; set; }

// blah blah blah

public void InitializeMyList()
{
  MyList = new ObservableCollection<MyObject>();
  for (int i = 0; i < 5; i++)
  {
    MyList.Add(InitializeMyObject(i));
  }
}

public MyObject InitializeMyObject(int i)
{
  MyObject theObject = new MyObject();
  theObject.MyID = i;
  theObject.MyString = "The object " + i;
  theObject.MyCommand = new RelayCommand(param =< this.ShowWindow(i));
  return theObject
}

private void ShowWindow(int i)
{
  // Just as an exammple, here I just show a MessageBox
  MessageBox.Show("You clicked on object " + i + "!!!");
}
于 2012-05-25T20:59:41.703 に答える
2

カスタム オブジェクトの ObservableCollection にバインドする簡単な例。カスタム オブジェクトにさらにプロパティを追加して、行の外観に一致させます。

 using System.Collections.ObjectModel;

 public MyClass
 {
      public ObservableCollection<MyObject> myList { get; set; }

      public MyClass()
      {
           this.DataContext = this;
           myList = new ObservableCollection<MyObject>();
           myList.Add(new MyObject() { MyProperty = "foo", MyBool = false };
           myList.Add(new MyObject() { MyProperty = "bar", MyBool = true };
      }
 }

 public MyObject
 {
      public string MyProperty { get; set; }
      // I believe will result in checkbox in the grid
      public bool MyBool { get; set; }
      //...as many properties as you want
 }

xamlで

  <DataGrid ItemsSource= "{Binding myList}" />

いくつかの小さな構文エラーがあるかもしれませんが、私はそれを完全に SO ウィンドウ内に書きました。

于 2012-05-25T20:21:11.917 に答える
0

私はWPFが初めてで、ダマスカスの例を使用して、リストをデータグリッドにバインドすることを学びました。しかし、彼の答えを使用すると、データグリッドには正しい行数が入力されますが、MyObject クラスのプロパティは入力されないことがわかりました。私はもう少し検索を行った後、私がしなければならなかったことを偶然見つけました。

MyObject クラスのプロパティをカプセル化して表示する必要がありました。それらを公開するだけでは十分ではありませんでした。

前:

public class MyObject
{
   public int MyID;
   public string MyString;
   public ICommand MyCommand;
}

後:

public class MyObject
{
    private int _myID;

    public int MyID
    {
        get { return _myID; }
        set { _myID = value; }
    }
    private string _myString;

    public string MyString
    {
        get { return _myString; }
        set { _myString = value; }
    }
    private ICommand _myCommand;

    public ICommand MyCommand
    {
        get { return _myCommand; }
        set { _myCommand = value; }
    }
}

素晴らしい例を提供してくれたダマスカスに感謝し、素晴らしい質問をしてくれたダンテに感謝します。これがあなたの投稿以降のバージョンの変更によるものかどうかはわかりませんが、私のように WPF を初めて使用する他の人に役立つことを願っています。

于 2013-12-17T14:26:23.653 に答える