1

以下の最初のコード セクションは、私が書きたくなるコードです。以下の 2 番目のコード セクションは、以前のコード ワーカーが同じタスクを達成しようとして書いたものです。

以前の同僚のコードは、アイテムの種類ごとに個別の ViewModel を持ち、ビューではなく ViewModel で SelectedItems を追跡し、モデルで ObservableCollection を回避するという、標準的な MVVM の慣行に従っているようです。

私が書きたいと思うコードは、サイズと複雑さが約半分になり、モデルと ViewModel が同期しなくなる可能性が少なくなり、コードの行数がはるかに少なくなります。

ここで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} />
4

1 に答える 1

0

Cheese は INotifyPropertyChanged を実装していますか? はいの場合、なぜですか?それにもかかわらず、私は相手の個人コードを使用します。モデルに関係のない新しいものを簡単に追加できます

于 2012-07-02T06:39:41.307 に答える