2012-06-30 27 views
1

下面的第一個代碼部分是我很想寫的代碼。下面的第二個代碼部分是以前的代碼工作者在嘗試實現相同任務時寫的內容。MVVM最佳實踐vs保持簡單的事情

以前的同事代碼似乎遵循標準的MVVM實踐,對每種類型的項目都有獨立的ViewModel,跟蹤ViewModel中的SelectedItems而不是視圖,以及避免模型中的ObservableCollection。

我很想寫的代碼是大約一半的規模和複雜性,與模型的可能性更小和視圖模型不同步的,和碼遠不如線。

MVVM是最好的做法真的在這裏正確的答案?是否有某種中間地帶結合了兩種版本中最好的?

我的代碼:

//Model 

public class Cheese 
{ 
    public string Name { get; set; } 
    public int Tastiness { get; set; } 
    public Color Color { get; set; } 
} 

public class CheeseEditorModel 
{ 
    public ObservableCollection<Cheese> Cheeses { get; private set; } 

    public CheeseEditorModel() 
    { 
     //read cheeses in from file/database/whatever 
    } 

    public DeleteCheeses(SelectedObjectCollection selected) 
    { 
     //delete cheeses 
    } 
} 

//ViewModel 

public class CheeseEditorViewModel 
{ 
    private CheeseEditorModel _model; 
    public ObservableCollection<Cheese> Cheeses { get {return _model.Cheeses} } 

    public CheeseEditorViewModel() 
    { 
     _model = new CheeseEditorModel(); 
    } 

    public DeleteSelected(SelectedObjectCollection selected) 
    { 
     _model.Delete(selected); 
    } 
} 

//XAML 

<ListBox Name="CheeseListBox" ItemsSource={Binding Path="Cheeses"} /> 
<Button Command={Binding DeleteSelected} CommandParameter="{Binding ElementName=CheeseListBox, Path=SelectedItems}" /> 

其他人的代碼:

//Model 

public class Cheese 
{ 
    public string Name { get; set; } 
    public int Tastiness { get; set; } 
    public Color Color { get; set; } 
} 

public class CheeseEditorModel 
{ 
    public List<Cheese> Cheeses { get; private set; } 

    public CheeseDataModel() 
    { 
     //read cheeses in from file/database/whatever 
    } 

    public DeleteCheeses(IEnumerable<Cheese> toDelete) 
    { 
     //delete cheeses 
    } 
} 

//ViewModel 

public class CheeseViewModel 
{ 
    private Cheese _cheese { get; set; } 
    public bool IsSelected { get; set; } 

    public CheeseViewModel(Cheese cheese) 
    { 
     _cheese = cheese; 
     IsSelected = false; 
    } 

    public string Name {get {return _cheese.Name} set { _cheese.Name = value } } 
    public int Tastiness {get {return _cheese.Tastiness} set { _cheese.Tastiness= value } } 
    public Color Color {get {return _cheese.Color} set { _cheese.Color = value } } 
} 

public class CheeseEditorViewModel 
{ 
    private CheeseEditorModel _model; 
    public ObservableCollection<CheeseViewModel> Cheeses { get; private set; } 

    public CheeseEditorViewModel() 
    { 
     _model = new CheeseEditorModel(); 
     foreach (cheese in _model.Cheeses) 
      Cheeses.Add(cheese); 
    } 

    public DeleteSelected() 
    { 
     var selected = from cheese in Cheeses select cheese.CheeseModel where cheese.IsSelected(); 
     _model.Delete(selected); 
     var selectedVM = from cheese in Cheeses select cheese where cheese.IsSelected(); 
     foreach (cheese in selectedVM) 
      Cheeses.Remove(selected); 
    } 
} 

//XAML 

<ListBox ItemsSource={Binding Path="Cheeses"}> 
<ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/> 
    </Style> 
</ListBox.ItemContainerStyle> 
</ListBox> 
<Button Command={Binding DeleteSelected} /> 
+0

絕緣Model對象是鬆散類似於屬性中的一個字段數據成員的絕緣。如果您不需要進行簡單數據訪問以外的其他任何操作,那麼額外的開銷會增加,但稍後當您想要增加其間的複雜度時,它會很方便。 –

+0

在你的代碼中,'CheeseEditorViewModel.Cheeses'的吸氣,你怎麼轉換'的ObservableCollection ''到的ObservableCollection '? – 2012-06-30 05:25:17

+0

@fmunkert:一個錯字,我的代碼中沒有'CheeseViewModel'在我的代碼,所以它只是一個'的ObservableCollection ' – junichiro

回答

0

沒有奶酪執行INotifyPropertyChanged?如果是,爲什麼?但我仍然與其他人的代碼一起去。您可以輕鬆地將視圖模型對象呈現(如本例)中添加新的非模式相關的東西

+0

奶酪不執行INotifyPropertyChanged,因爲應用程序是足夠簡單,沒有人需要知道關於除了做出改變的UI元素之外的更新。但是,是的,考慮到我的版本並沒有真正將模型與程序的其餘部分分開,我將放棄我的想法。 – junichiro