MVVMパターンを使用すると、Model
オブジェクトが複雑になるとき、つまりプリミティブではない/組み込まれていないプロパティが含まれているときに問題が発生します。私の特定のインスタンスでは、私自身がModelC
オブジェクトのコレクションが含まれていModelB
オブジェクトのコレクションが含まれていModelA
を持っている:私は複雑なモデルを持つMVVM
class ModelA
{
public string Name { get; set; }
public OberservableCollection<ModelB> Bs { get; set; }
}
class ModelB
{
public string Make { get; set; }
public ObservableCollection<ModelC> Cs { get; set; }
}
class ModelC
{
public string Brand{ get; set; }
}
ModelB Bs
プロパティのコレクションへのアクセスを許可するModelAViewModel
。この例では、ModelB
のためにViewModel
を作成していません。私は、各エンティティはつまり、ModelB
とModelC
、これは物事のMVVMの方法ではないとということを知らされている
<DataTemplate x:Key="modelATemplate">
<Grid Margin="5">
<Grid.RowDefinitions>
<RowDefinition />
</Grid.RowDefinitions>
<ScrollViewer Grid.Row="2" VerticalScrollBarVisibility="Auto">
<ItemsControl ItemsSource="{Binding Bs}" ItemTemplate="{StaticResource modelBTemplate}"/>
</ScrollViewer>
</Grid>
</DataTemplate>
<DataTemplate x:Key="modelBTemplate">
<Grid Margin="5" HorizontalAlignment="Center">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="{Binding Make}">
<ItemsControl Grid.Row="1" ItemsSource="{Binding Mode=OneWay, Path=Cs}"
ItemTemplate="{StaticResource ResourceKey=modelCTemplate}">
</ItemsControl>
</Grid>
</DataTemplate>
:私はDataTemplate
Sを使用してModelB
とModelC
コレクション(および個々のインスタンス)をスタイリングしています独自のViewModel
が必要です。私はModel
のクラスを維持するように言われましたが、それらのためにViewModel
を作成します。私はこれがどのように機能するかを視覚化することができません。
私が作成した場合ModelBViewModel
:
public class ModelBViewModel
{
ModelB MyModelB { get; set; }
}
私は苦境を持っている - 私はすでにModelA
クラス内ModelB
インスタンスを持って、私は今ModelBViewModel
内の他のModelB
のインスタンスを持っているでしょう。元のModelB
コレクションをModelA
内に繰り返し、MyModelB
プロパティをModelA
と一致するように設定して、ModelBViewModel
を作成する必要がありますか?むしろ単純なものには少し複雑に思えますか?
あなたのモデルは 'ObservableCollection'(通知を上昇する)を使用しているが、あなたは、例えばのためにあらゆる種類の通知を実装していませんでした'ModelB.Make'、' ModelB.Cs'、 'ModelC.Brand'が変更されます。したがって、技術的にはMVVMではありません。通常、モデルはViewModel( 'INotifyPropertyChanged'が良い)に通知するメカニズムを提供する必要がありますが、ViewModelは' INotifyPropertyChanged'をほぼ実装する必要があります。おそらく 'ModelB' /' ModelC'に 'INotifyPropertyChanged'を実装するほうが簡単ですが、実際にはバインディングに直接使用できるViewModelになります。 – Sinatr
なぜ、 'INotifyPropertyChanged'を実装していないものへのバインディングが動作しているのかを見てください(http://stackoverflow.com/q/7767218/1997232)。 TLDR;モデルに加えられた変更は、ビュー自体が作成された場合にのみビューに表示されます。 – Sinatr
@Sinatr通知を発行しても、「MVVMではない」という意味ではありません。 – jannagy02