2015-12-31 178 views
-1

我想學習MVVM,並在我的ViewModel中添加了隱式運算符,它將模型轉換爲ViewModel,反之亦然,但現在的問題是如何將模型列表轉換爲列表ViewModel的?如何將列表轉換爲隱式運算符類型

下面是我試圖使用列表轉換結構代碼,但它不工作:

Person.cs

class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

PersonViewModel.cs

class PersonViewModel : Person 
{ 
    public string FullName { get; set; } 

    public static implicit operator List<PersonViewModel>(IList<Person> person) 
    { 
     if (person == null) 
      return null; 

     return person.Select(c => new PersonViewModel(c)).ToList(); // This is not working 

    } 

    public static implicit operator PersonViewModel(Person person) 
    { 
     return new PersonViewModel 
     { 
      FirstName = person.FirstName, 
      LastName = person.LastName, 
     }; 
    } 

    public static implicit operator Person(PersonViewModel personViewModel) 
    { 
     return new Person 
     { 
      FirstName = personViewModel.FirstName, 
      LastName = personViewModel.LastName, 
     }; 
    } 

} 
+0

好吧,這可能是愚蠢的問題,但不是你錯過了「新」關鍵詞? –

+0

@ViktorLaCroix編輯我的帖子,但這次它抱怨說「PersonViewModel不包含帶1個參數的構造函數」 – Dishant

+1

並且它包含帶有1個參數的構造函數嗎? :D如果不是,你不想要那麼你應該做一些像person.Select(x => new PersonViewModel(){FullName = c.FullName})。ToList(); –

回答

0

嘗試使用鑄鐵

person.Cast<PersonViewModel>().ToList(); 

已更新

這會給你其他錯誤。您可以使用擴展方法,並在需要時明確調用它們。這樣的事情(請確保你最終檢查爲空)

+0

啊,我的壞,編輯我的帖子。現在它給出的錯誤是「PersonViewModel不包含帶1個參數的構造函數」。 – Dishant

+0

啊,好的:)更新了我的答案。不過,我認爲你最終會因爲更多的錯誤而失敗,因爲你不能在那裏使用那個接口,你可以在基類中定義隱式運算符。 – bbeda

+0

tnx,我試着鑄造,但現在它抱怨說「用戶定義的轉換必須轉換爲或從封閉類型轉換」。 – Dishant

0

我很抱歉,但你的「MVVM模式」似乎對我來說很奇怪。
這是我MVVM模式的理解

//Model 
class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

//ModelWrapper which implements INotifyPropertyChanged if Model doesn't 
//Here you can add additional properties which will serve a View's needs 
class PersonModelWrapper 
{ 
    private Person _Model; 

    //Through this constructor you will create instance of modelwrapper 
    //without any conversions 
    public PersonModelWrapper (Person model) 
    { 
     _Model = model; 
    } 

    public string FirstName 
    { 
     get 
     { 
      return _Model.FirstName; 
     } 
     set 
     { 
      _Model.FirstName = value; 
     } 
    } 
    public string LastName 
    { 
     get 
     { 
      return _Model.LastName; 
     } 
     set 
     { 
      _Model.LastName = value; 
     } 
    } 
    public string FullName 
    { 
     get 
     { 
      return _Model.FirstName + " " _Model.LastName; 
     } 
    } 

    //Through this property you will always access current model property 
    //without conversions 
    public Person Model { get { return _Model; }} 
} 

//ViewModel which used as DataContext in the View 
class PersonViewModel 
{ 
    private PersonModelWrapper _Wrapper; 
    public string Wrapper 
    { 
     get 
     { 
      return _Wrapper; 
     } 
     set 
     { 
      _Wrapper = value; 
     } 
    } 
} 

編輯的答案@馬克·費爾德曼評論
如果包裝看起來不必要或代碼膨脹,然後「ModelWrapper」可以跳過INotifyPropertyChanged可以實現由模型本身。 如果您不關心通知有關模型屬性更改的視圖,則不需要將模型集合轉換爲ViewModels集合。
您的視圖模型將包含類型的ObservableCollection

class PersonViewModel 
{ 
    public ObservableCollection<Person> Persons { get; set; } 

    //if you don't care about tracking changes of collection(Add, Remove) 
    //then use only List<Person> without any conversions 
    public List<Person> Persons { get; set; } 

} 

視圖模型的屬性,而不包裝

public class PersonViewModel: INotifyPropertyCahnged 
{ 
    private Person _Model; 
    public Person Model 
    { 
     get { return _Model; } 
     set 
     { 
      if(Equals(_Model, value) == true) 
       return; 
      _Model = value; 
      this.RaisePropertyChanged(); 
     } 

     public String FullName {get {return _ModelFirstName + " " + _Model.LastName; }} 

     public PersonViewModel(Person model) 
     { 
      _Model = model; 
     } 
    } 
} 

然後將模型的清單視圖模型的收集發生在相同的方式,通過構造

+0

從我可以收集的問題不是關於如何通過視圖模型向視圖公開模型屬性,而是如何保持視圖模型集合與關聯的模型集合同步而不會遇到代碼膨脹。我個人並不認爲INPC是視圖關係視圖關係的唯一要求,所以我傾向於將它添加到模型中以及屬性和集合。之後,視圖模型訂閱他們模型的CollectionChanged事件的一個簡單問題,同時仍然顯示您在此處顯示的屬性。 –

+0

@MarkFeldman,我只是因爲OP通過繼承將模型中的所有屬性暴露給viewmodel而創建了Wrapper。如果你在評論中描述過,請參閱我的更新回答 – Fabio

+0

@MarkFeldman,據我所知,這個問題與viewmodel的集合沒有關於同步模型的集合,因爲轉換另一個類型(如OP的方法)將始終創建新實例。 – Fabio

相關問題