使用mvvm

时间:2016-10-07 17:46:16

标签: c# wpf mvvm data-binding datagrid

所以我有一个带有数据网格的WPF MVVM应用程序,我在设置数据网格时遇到了一些麻烦。我已经简化了模型以使这更容易看到问题,但试着假设模型不能改变(除非由于某种原因它绝对必须)。我有一个可观察的自定义对象集合作为我的项目源。让我们调用对象MyObject。所以我把它作为我的datagrid的itemsource:

ObservableCollection<MyObject> myObjectCollection;

每个对象都包含另一种自定义对象的可观察集合。我们将这些新对象称为MyObjectElement。所以每个MyObject都有属性:

ObservableCollection<MyObjectElement> myObjectElementCollection;

每个MyObjectElement都有3个属性:

string Name;
string Element;
bool IsField;

可以安全地假设每个MyObject在myObjectElementCollection中具有相同数量的MyObjectElements,并且它们都具有匹配的Name和IsField属性。只有在IsField属性设置为true时,我才想在MyObject的myObjectElementCollection中为每个MyObjectElement创建一个列。元素是每个单元格的值。

现在这是问题的第一部分:通过支持双向绑定来生成DataGrid。此问题的第二部分是DataGrid列类型。

我有2个类,MyObjectImage和MyObjectTextBox。这些都继承自MyObjectElement。 MyObject中的集合myObjectElementCollection实际上不包含任何MyObjectElements。它只包含MyObjectImage和MyObjectTextBox对象。如果MyObjectElement的类型是MyObjectTextBox,那么它应该只显示字符串。

但是,如果类型为MyObjectImage,则datagrid列应显示图像。 MyObjectImage包含一个名为ImageType的字符串属性。此字符串将始终为三个值中的一个:“PNG”,“XAML”或“SVG”。如果它等于“PNG”,则可以安全地假设Element是png的base64字符串。如果它等于“XAML”,则可以安全地假设图像存储为Element中的大型XAML字符串。如果它等于“SVG”,那么可以安全地假设图像将是svg作为字符串,我有一个转换器函数,将其转换为XAML字符串。用户可以通过双击单元格来更改图像,尽管这与问题半无关。假设ImageType属性与其他myObjectElementCollections中关联的ImageTpe属性匹配也是安全的。

如果您能够向此数据网格问题的任何部分输入任何建议,那就太棒了!几个星期以来,我一直在喋喋不休!为了使事情变得更容易,这里是模型结构的一些示例代码(可以安全地假设在ObservableObject类中实现了INotifyPropertChanged):

我的对象

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)
    {
    }
}

同样,任何和所有的帮助都受到这个问题的赞赏;谢谢!

1 个答案:

答案 0 :(得分:0)

我能够通过可以找到here的方法完成问题的第一部分。这个问题的第二部分应该可以通过模板传入的项来完成。我可以轻松地创建一个图像属性,从任何一个转换为位图图像作为datagrid列的显示。