2016-10-07 17 views
0

データグリッドを持つWPF MVVMアプリケーションがあり、データグリッドの設定に問題があります。私はモデルを簡略化して問題を見やすくしましたが、何らかの理由でモデルが変更できないと仮定しようとしました。私は、アイテムソースとしてのカスタムオブジェクトの観測可能なコレクションを持っています。オブジェクトMyObjectを呼び出しましょう。だから、私はDataGridのitemsourceとしてこれを持っている:mvvmを使用したDataGridへの動的列によるバインド

ObservableCollection<MyObject> myObjectCollection; 

各オブジェクトは、カスタムオブジェクトの別のタイプの監視可能なコレクションが含まれています。これらの新しいオブジェクトMyObjectElementを呼び出してみましょう。したがって、各MyObjectには、プロパティを持っています

string Name; 
string Element; 
bool IsField; 

安全に、各MyObjectにはmyObjectElementCollectionでMyObjectElementsの同じ数を持っていると仮定することができ、それらはすべて一致している:

ObservableCollection<MyObjectElement> myObjectElementCollection; 

各MyObjectElementは、3つの特性を有しています名前とIsFieldのプロパティ。 IsFieldプロパティがtrueに設定されている場合のみ、MyObjectのmyObjectElementCollection内の各MyObjectElementの列が必要です。要素は各セルの値です。

これが問題の最初の部分です。つまり、双方向バインディングをサポートするようにDataGridを生成することです。この問題の2番目の部分は、DataGridの列型です。

私は2つのクラスMyObjectImageとMyObjectTextBoxを持っています。これらは両方ともMyObjectElementから継承されます。 MyObjectのコレクションmyObjectElementCollectionには、実際にMyObjectElementsが含まれていません。 MyObjectImageオブジェクトとMyObjectTextBoxオブジェクトのみが含まれます。 MyObjectElementの型がMyObjectTextBoxの場合、文字列が表示されます。

ただし、タイプがMyObjectImageの場合、DataGridカラムに画像が表示されます。 MyObjectImageには、ImageTypeという文字列のプロパティが含まれています。この文字列は、常に「PNG」、「XAML」、または「SVG」の3つの値の1つになります。 "PNG"に等しい場合、Elementがpngのbase64文字列であると仮定することは安全です。 "XAML"に等しい場合、イメージがElementに大きなXAML文字列として格納されていると見なすことは安全です。それが "SVG"に等しい場合は、イメージが文字列としてのsvgであると仮定することは安全です。これは、それをXAML文字列に変換する変換関数を持っています。ユーザは、セルをダブルクリックすることでイメージを変更しますが、それは問題に半無関係です。 ImageTypeプロパティが、他のmyObjectElementCollectionsのImageTpeプロパティに関連付けられていると仮定することも安全です。

このデータグリッドの問題のいずれかの部分に任意のアドバイスを入力することができれば、それは素晴らしいでしょう!私は数週間この頭を叩いている!物事が少し簡単にするために、ここでは、モデルの構造のいくつかのサンプルコードは、(INotifyPropertChangedは、クラスObservableObjectに実装されていると仮定しても安全である)である:

マイオブジェクト

public class MyObject : ObservableObject 
{ 
    private ObservableCollection<MyObjectElement> _MyObjectElements; 

    public ObservableCollection<MyObjectElement> MyObjectElements { get { return _MyObjectElements; } set { if (_MyObjectElements!= value) { _MyObjectElements= value; RaisePropertyChanged("MyObjectElements"); } } } 
} 

MyObjectElement

public class MyObjectElement : ObservableObject 
{ 
    private string _Name; 
    private string _Element; 
    private bool _IsField; 

    public string Name { get { return _Name; } set { if (_Name != value) { _Name = value; RaisePropertyChanged("Name"); } } } 
    public string Element { get { return _Element; } set { if (_Element != value) { _Element = value; RaisePropertyChanged("Element"); } } } 
    public bool IsField { get { return _IsField; } set { if (_IsField != value) { _IsField = value; RaisePropertyChanged("IsField"); } } } 
} 

MyObjectImage

public class MyObjectImage : MyObjectElement 
{ 
    private string _ImageType; 

    public MyObjectImage() : base() 
    { 
    } 

    public MyObjectImage(string name, string element, string imageType) : base(name, element) 
    { 
     ImageType = imageType; 
    } 

    public string ImageType { get { return _ImageType; } set { if (_ImageType != value) { _ImageType = value; RaisePropertyChanged("ImageType"); } } } 
} 

MyObjectTextBox

public class MyObjectTextBox : MyObjectElement 
{ 
    public MyObjectTextBox() : base() 
    { 
    } 

    public MyObjectTextBox(string name, string element) : base(name, element) 
    { 
    } 
} 

ここでも、任意およびすべてのヘルプはこの問題に高く評価され、ありがとうございました!

答えて

0

hereという方法で問題の最初の部分を達成することができました。この問題の2番目の部分は、着信アイテムをテンプレート化することによって達成できるはずです。データグリッド列の表示としてビットマップイメージへの変換を行うイメージプロパティを簡単に作成できます。

関連する問題