0

レコードを追加および削除できる DataGrid (dataGrid1) があります。

そのdataGrid1に基づいて、IDとタイプに基づいてボタンを含む新しいグリッドを作成したいと思います。Cols も動的に add の DataSource を指定する必要がありますが、それは Window_Loaded 自体で初めて生成するときだけです。行は、dataGrid1 の変更に基づいて追加/削除できます。私はこのようなものが欲しい:

ここに画像の説明を入力

Btn をクリックするたびに、特定のタイプと特定の ID を入力するための新しいウィンドウが開きます。詳細がすでに入力されている場合、btn のテキストは「更新」または「追加」になります。

この操作を実行するのに最適なリソース/コントロールは何ですか? 現在、2つの安定した列でグリッドを作成しました。上記でGrid、DataGridなどを使用するためのアイデア。また、行の追加/削除は、どのように、どのように簡単になります。

どんな助けでも大歓迎です。

4

1 に答える 1

1

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

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

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 + "!!!");
}

これは、必要なものを作成するのに十分なはずです。ご覧のとおり、everyは、新しいウィンドウを表示するように定義されButtonたメソッド ( ShowWindow) を呼び出し、内部で必要なことを行います。はRelayCommand、その名前が示すように、ボタンによって起動されたコマンドを実行ロジックを含むメソッドにリレーするために実際にここにあります。

そして... 必要なのはそれだけだと思います。返信が遅くなり申し訳ありません

編集 - 手動/動的に列を生成する

次のコードは、同様の問題が発生したときに実行しなければならなかったコードの一部です。ComboBox私の問題は、 a が変更されるたびに表示される列を変更する必要があることでしたSelectedItem。だから私はこれをSelectionChangedイベントハンドラーに入れました。列を生成する必要がある正確な場所はわかりませんが、一般的な例を示します。

あなたItemsSourceObservableCollection<MyNewObject>

MyNewObjectは次のとおりです。

public class MyNewObject
{
   public IList<string> MyStrings { get; set; }
}

コードのどこかに(列を生成する必要がある場合に)次のコードを配置する必要がありますMyNewObject。これは、リストの最初のものの長さに等しい数の列を生成します(注:これはコードビハインドにあり、DataGridあなたが取り組んでいるのはdataGridという名前です)

ObservableCollection<MyNewObject> source = dataGrid.ItemsSource as ObservableCollection<MyNewObject>;

if (source == null || source.Count == 0)
{
  return;
}
MyNewObject firstObject = source[0];

for(int i = 0; i < firstObject.MyStrings.Count; i++)
{
   // Creates one column filled with buttons for each string
   DataGridTemplateColumn columnToAdd = new DataGridTemplateColumn();
   columnToAdd.Width = 110; // I set a manual width, but you can do whatever you want
   columnToAdd.Header = "Header number " + i;

    // Create the template with a Button inside, bound to the appropriate string
    DataTemplate dataTemplate = new DataTemplate(typeof(Button));
    FrameworkElementFactory buttonElement = new FrameworkElementFactory(typeof(Button));

    Binding binding = new Binding("MyStrings[" + i + "]");
    binding.Mode = BindingMode.TwoWay;
    binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;

    buttonElement.SetBinding(Button.ContentProperty, binding);

    // Do the same here for your command, or for whatever you want to do when the user clicks on this button

    dataTemplate.VisualTree = buttonElement;
    columnToAdd.CellTemplate = dataTemplate;
    dataGrid.Columns.Add(columnToAdd);
}

これにより、最初のオブジェクトで見つかった文字列ごとに 1 つの列が作成されます。次に、必要なコマンドまたは表示トリックを使用して拡張します。

于 2012-05-23T18:47:51.647 に答える