下面的第一個代碼部分是我很想寫的代碼。下面的第二個代碼部分是以前的代碼工作者在嘗試實現相同任務時寫的內容。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} />
絕緣Model對象是鬆散類似於屬性中的一個字段數據成員的絕緣。如果您不需要進行簡單數據訪問以外的其他任何操作,那麼額外的開銷會增加,但稍後當您想要增加其間的複雜度時,它會很方便。 –
在你的代碼中,'CheeseEditorViewModel.Cheeses'的吸氣,你怎麼轉換'的ObservableCollection''到的ObservableCollection '? –
2012-06-30 05:25:17
@fmunkert:一個錯字,我的代碼中沒有'CheeseViewModel'在我的代碼,所以它只是一個'的ObservableCollection' –
junichiro