3


1

バインディングを使用して宣言的にWPFでDataGridの列を指定および表示しますか?

バインディングを使用してDataGrid列を宣言的に指定する方法はありますか? (そして、このバインディングを使用して列のプロパティを設定するには?)アイデアとして、オブジェクトのリストがあります(例: 行)ItemsSourceにデータバインドされ、そのプロパティの1つは、名前と値を持つディクショナリ(または特定のクラスのオブジェクトのリストなど)になります。 DataGridが、いくつかのコードビハインドなしでこれらの追加の列を自動的に作成することを望みます。 それでも可能ですか? または、これをどのように回避しますか?

余分な値を保持する配列は時間とともに変化する可能性がありますが、リスト内のすべてのアイテムで同じになります。

列を作成するためだけにDataGridに別のリストを提供することは可能です(そしてクリーンです)。 しかし、そのためにはColumnsSourceなどが必要になります…​

私が思いついた唯一のことは、DataGridのサブクラスを作成することでした…​

何か案は?

編集:ポイントは、背後にあるコードなしでこれを達成しています…​

3 Answer


1


XAMLで、データグリッドを、プロパティを持つ特定のクラスのオブジェクトのObservableCollectionにバインドします。

XAML:


次に、C#/ VBAでプログラムで列を作成し、個々の列をObservableCollectionのオブジェクトが含まれるクラスのプロパティにバインドできます。 クラスのオブジェクトを追加すると、データグリッドに行が追加されます。 つまり、ObservableCollection内のクラスの各オブジェクトは行になり、クラスのプロパティは列になります。

プログラムで列をバインドする方法の例を次に示します…​ C#:

ObservableCollection datagridData = new ObservableCollection< IData >();
Binding items = new Binding();
PropertyPath path = new PropertyPath("Name"); // 'Name' is actually the name of the variable representing the property
items.Path = path;

MyDataGrid.Columns.Add(new DataGridTextColumn()
{
   Header = "Names",
   Width =  275,
   Binding = items
});
//repeat the creation of columns
//...
//- Add some objects to the ObservableCollection
//- Then bind the ItemsSource of the datagrid to the ObservableCollection
datagridData .Add(new Data("Bob", string.Empty));
MyDataGrid.DataContext = new DataModel{ MyData = datagridData };

*編集:それについてすみません! XAMLで同じことを完全に達成する方法は次のとおりです。


編集2:C#ではObservableCollectionとクラスのコードは次のようになります。

public class DataModel
    {
        public ObservableCollection MyData{ get; set; }
    }

public interface IData
    {
        string Name{ get; set; }
        string Age{ get; set; }
    }

public class Data : IData
    {
        public Data(string name, string age)
        {
            Name= name;
            Age= age;
        }

        public string Name{ get; set; }
        public string Age{ get; set; }
    }


1


物議を醸すリスクがある…​

これは、ビューが実際に少しのコード「ブースト」を必要とし、「コードビハインドなし」のガイドラインを片側に置くことができる1つの例だと思います - 懸念事項を分けておくことを忘れない限り。

過去に、ViewModelから関連データを取得し、コードビハインドでPartialの答えに似た 'BuildDataGrid’メソッドを記述することで、動的にDataGridコントロールを作成しました。 コードはビューの補完に純粋に関係していたため、これが正当であると信じています。ビジネスルールを実装することで懸念を混ぜることはしませんでした-列をまとめて、必要に応じて列Bindingsを作成しました。

ただし、コードビハインドをクリーンに保つことがより重要な場合は、ユーザーコントロールを作成し、DPを使用してコントロールを「サブクラス化」するという元の考えをお勧めします。


0


グリッドをサブクラス化する必要があると思います。 Columnsはバインド可能なプロパティではありません。 バインドできない場合、xamlで動的に操作することはできません。

アイテムを使用して列を作成することに関して、それはグリッドにアイテムがなければ列がないことを意味しますか?

バインドできる列プロパティを持つグリッドのサブクラスがある場合、列を動的に変更する場所はビューモデルになります。