私はMVVMを使用していますが(まだまだ私は非常に新しくなっています)、少しパターンに苦しんでいます。私はネットワークとプラットフォームの2人の子供を持つミッションと呼ばれるオブジェクトを持っています。ミッションは、1対多のプラットフォームを持ち、1つまたは2つのネットワーク(常に存在するプライマリとオプションの代替)を持っています。 NetworkPlatformという名前のNetwork and Platformの子があり、それらの数はプラットフォームとネットワークの数に依存します.5台のプラットフォームがあり、代替ネットワークを定義していない場合は5台のNetworkPlatformがあります。プラットフォームが追加されました代替ネットワークが存在するかどうかによって、1つまたは2つのネットワークプラットフォームを追加する必要があります。同様に、以前に存在しなかった代替ネットワークを定義する場合、プラットフォームごとにネットワークプラットフォームを追加する必要があります。同上。MVVMのパターンと従属する子ども
私は、私はまだそれに対処する方法は非常にわからないので、私は別のものをコメントしました。この
public MissionFullDataViewModel(Mission mission):base(mission)
{
MissionVM = new MissionViewModel(mission);
PlatformsVM = new PlatformsViewModel(mission);
PrimaryNetworkVM = new NetworkViewModel(mission, mission.PrimaryNetwork);
//AlternateNetworkVM = new NetworkViewModel(mission, mission.AlternateNetwork);
}
のようないくつかの子のviewmodelsをインスタンス化するミッションのための傘のViewModelのようなものを持っています。ユーザーは、チェックボックスを使用して1つを選択するように指示しますが、アプリケーションは既存のデータを表示するために使用されるため、代替データが存在するかどうかを確認する必要があります。まだそれについてはあまり確かではありません。
私はNetworkViewModelでNetworkPlatformsを扱っています、彼らはこのようなのObservableCollectionです:
private ObservableCollection<NetworkPlatform> networkPlatforms;
public ObservableCollection<NetworkPlatform> NetworkPlatforms
{
get
{
if (networkPlatforms == null)
{
networkPlatforms = new ObservableCollection<NetworkPlatform>(Network.NetworkPlatforms);
}
return networkPlatforms;
}
}
}
と私ははっきりとそのコレクションからNetworkPlatformを追加および削除するにはいくつかのメソッドを記述する必要があります。 私のプラットフォームは、PlatformsViewModelで観測可能なコレクションです。
private void ResyncPlatforms(int newValue)
{
int oldValue = this.Platforms.Count;
int diff = newValue - oldValue;
if (diff > 0)
{
for (var i = 0; i < diff; i++)
{
var newPlatform = new Platform();
newPlatform.Mission = Mission;
this.Platforms.Add(newPlatform);
missionRepository.AddPlatformToMission(Mission, newPlatform);//TODO need to tell the Network VM to add a network platform
}
}
else
{
for (var i = 0; i > diff; i--)
{
var platToRemove = Platforms.Last();
this.Platforms.Remove(platToRemove);
missionRepository.RemovePlatformFromMission(Mission, platToRemove);//TODO need to tell the Network VM to remove network platform
}
}
}
リポジトリがLINQToSQLバックエンドへのCRUDオプションを持つラッパーです:私は、プラットフォームの数を指定するためのユーザのための数スピナーと新しいものを追加したり、このような最後のx個のものを削除する関数を持っています。 Add ...とRemove ...メソッドは、コミット時(ユーザーが保存するとき)に挿入/削除するようデータベースに指示します。
したがって、PlatformsVMがresyncメソッドでプラットフォームを追加/削除するときにNetworkPlatformを追加/削除するにはどうすればよいですか?
networkplatformsのコレクションを追加および削除するNetworkViewModelのメソッドにResync関数を呼び出すことができます。ユーザーが代替ネットワークをオンまたはオフに切り替えると、傘型ビューモデルで同様のことが起きる可能性があります。しかし、私のPlatforms VMはプライマリと代替ネットワーク(存在する場合)のNetworkviewModelsにアクセスする必要があるので、より良い方法が必要だと思うし、代替のときにそれを行う方法を実際に見ることはできませんネットワークがオンとオフに切り替わります。
私のnetworkviewmodelは、PlatformVMのPlatforms Observableコレクションの変更をリッスンする方が良いでしょうか?
私は何をすべきか明確ではなく、助けていただければ幸いです。ありがとう。
#3と#4では何でしょうか.HandlePlatformsChange do - NetworkVMのハンドラを呼び出すだけですか?申し訳ありませんがイベントになると私は少しダンスですが、私はそれらをあまり使用していない。 – Nix
ええ、たぶんあなたのケースでは、NetworkVMの 'update'関数を呼び出すメソッドにすぎないでしょう。 :) –
@Nix:ほとんどの単純なケースでは、NetworkVMハンドラを呼び出すだけです(入力に合わせてデータを修正することも可能です)。より高度なケースでは、あらゆる種類の検証、準備、何もできません(「NetworkVM」はハンドラを公開する必要さえないかもしれません)。 –