扩展我的模型

时间:2011-07-30 07:00:34

标签: c# wpf object mvvm model

我正在研究WPF MVVM框架

我有ItemType模型

public class ItemType
{
    public long ItemTypeID { get; set; }
    public long ItemCategoryID { get; set; }
    public string Name { get; set; }
}

和其他ItemCategory模型

public class ItemCategory
{
    public long ItemCategoryID { get; set; }
    public string Name { get; set; }
}

现在我想将ItemType绑定到数据网格,但我不想显示ItemCategoryID。我想展示ItemCategory.Name

如何在不改变原班级的情况下完成这项工作?

3 个答案:

答案 0 :(得分:2)

这是MVVM使用ViewModel的原因。

不要修改Model,而是创建根据View需求构建的ViewModel类。那就是你要省去你不想要的财产。

修改

这是一种方法:

public class ItemTypeViewModel : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            if (_name != value)
            {
                _name = value;
                OnPropertyChanged("Name");
            }
        }
    }

    private string category;
    public string Category
    {
        get { return category; }
        set
        {
            if (category != value)
            {
                category = value;
                OnPropertyChanged("Category");
            }
        }
    }

    public static ItemTypeViewModel FromModel(ItemType model)
    {
        var itemTypeViewModel = 
            new ItemTypeViewModel 
            {
                Name = model.Name,
                Category = categories[model.CategoryID].Name;
            };
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        var p = PropertyChanged;
        if (p != null)
        {
            p(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

public class ItemTypesViewModel : ObservableCollection<ItemTypesViewModel>
{
    private ObservableCollection<ItemTypeViewModel> _collection;

    public ObservableCollection<ItemTypeViewModel> Collection
    {
        get { return _collection; }
        set
        {
            if (_collection != value)
            {
                _collection = value;
                OnPropertyChanged(new PropertyChangedEventArgs("Collection"));
            }
        }
    }
}

使用静态方法为模型中的每个ItemType创建ItemTypeViewModel的实例。将它们全部放在ItemTypeSViewModel

将DataGrid绑定到集合。

我从ViewModel中删除了ItemType和ItemCategory之间模型中存在的关系。这只是处理这种结构的一种方式。相反,您也可以为ItemCategory创建一个ViewModel类,并在ItemTypeViewModel类中引用ItemCategoryViewModel类的实例。

请注意,这只是解决此问题的一种方法。您也可以通过其他方式解决此问题。另外:您还需要提供从ViewModel类到模型的转换。

最后一点建议:如果这是新的,你开始阅读/观看MVVM上的教程:https://stackoverflow.com/questions/2267903/learning-mvvm-for-wpf

答案 1 :(得分:2)

两个人提供的答案完全有效,符合您的需求,就像我理解您的问题一样。基本思路是:

@Amani:

//check if the query fits your needs
var temp = from i in categoryList
                   from it in itemList
                   where i.ItemCategoryID == it.ItemCategoryID 
                   select new { i, it };

进行交叉查询以生成新的组合类型,可以是

public class ItemTypeViewModel
{
    public long ItemTypeID { get; set; }
    public string ItemCategoryName { get; set; }
    public string ItemTypeName { get; set; }
}

这是根据MVVM模式指南回复的@Erno。使用ItemTypeViewModel对象的集合将它们绑定到您的视图。

希望这有帮助。

问候。

答案 2 :(得分:1)

如果这是您的数据库模型,您可以轻松地创建一个视图来连接这些表。或者您可以将以下代码用作模式:

        var temp = from i in categoryList
                   from it in itemList
                   where i.ItemCategoryID == it.ItemCategoryID 
                   select new { i, it };

希望得到这个帮助。