2011-07-30 20 views
1

我在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

如何在不更改原始類的情況下完成此操作?

回答

2

這就是MVVM使用ViewModel的原因。

不要修改模型,而是根據視圖的需要創建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")); 
      } 
     } 
    } 
} 

使用靜態方法在模型創建ItemTypeViewModel的情況下,每個ItemType的。把它們全部放在ItemTypeSViewModel的'Collection'屬性中。

將DataGrid綁定到集合。

我從我的ViewModel中刪除了模型中ItemType和ItemCategory之間存在的關係。這只是處理這種構造的一種方式。相反,您也可以爲ItemCategory創建ViewModel類,並將ItemTypeViewModel類中的引用添加到ItemCategoryViewModel類的實例中。

請注意,這只是處理此問題的一種方法。你也可以用其他方式解決這個問題。另外:您還需要提供從ViewModel類到Model的轉換。

提醒的最後一點:https://stackoverflow.com/questions/2267903/learning-mvvm-for-wpf

+0

我對每個視圖使用一個視圖模型並從數據庫中獲取數據。 As ObserableCollection 並將它們綁定到我的視圖網格。我應該做什麼改變? – thewayman

+0

創建一個包含您在用戶界面中所需的屬性和命令的類(這是一個ViewModel類,它應該實現INotifyPropertyChanged)。從數據庫加載模型類後,使用來自這些模型的數據加載ViewModel類)將網格綁定到ViemModel類。我會給我的答案添加一個例子。 –

+0

@Taufiq:我添加了一個例子。 –

1

如果這是您的數據庫模型,您可以輕鬆製作一個視圖來加入這些表。或者你可以使用下面的代碼作爲模式:

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

希望得到這個幫助。

+0

雅我知道,但有沒有其他方式通過代碼?因此,每種不同類型的視圖都需要新的數據庫調用,新的模型,數據邏輯層中的新功能以及業務邏輯層等... – thewayman

+0

我有關於模型的數據可以擴展嗎?怎麼樣? – thewayman

+0

我在上面添加了一些代碼。看一看。 – saber

2

由兩個傢伙提供的答案是完全有效的滿足您的需求,就像我理解你的問題:如果你開始閱讀/上MVVM觀看教程,這是新的。其基本思想是:

@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 }; 

使這是根據MVVM圖案方針迴應交叉查詢,生成一個新的組成型,它可以是

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

由@Erno。使用一組ItemTypeViewModel對象將它們綁定到您的視圖。

希望這會有所幫助。

問候。

+0

謝謝我現在明白我擁有ItemTypeViewModel我使用綁定到一個視圖名稱ItemTypeView我在哪裏輸入ItemType我應該怎樣命名viewmodel在哪裏我保持對象的集合? – thewayman

+0

如果您需要此類,那麼此類的屬性也可以實現INotifyPropertyChanged接口,如@Erno所示,並將XAML中此類型的屬性綁定到您的視圖。 – Tigran