コレクションビューのソースを観察可能なコレクションにバインドできます。私の質問は: mvvm を使用している場合、なぜ分離コードのように見えるものでこれらすべてを行っているのですか?
ViewModel コンストラクター:
public PrimarySearchViewModel()
{
this.SearchResultsCVS = new CollectionViewSource();
if (IsInDesignMode)
{
DesignMode_CreateSearchResults();
// Code runs in Blend --> create design time data.
}
else
{
//Messenger.Default.Register<IEnumerable<ReadmitPatientList>>(this, MessageTypes.EXECUTESEARCHREQUEST, RefreshSearchResults);
//Messenger.Default.Register<MessageTypes.EXECUTESEARCHREQUEST>>(this,ICollection<ReadmitPatientList>,RefreshSearchResults);
Messenger.Default.Register<Messages.DisplayReadmitPatientListMessage>(this, onReciveDisplayReadmitPatientListMessage);
Messenger.Default.Register<WavelengthIS.Core.Messaging.SaveNotification<QuestionairreViewModel>>(this, sn => ClearSearchResults());
// Code runs "for real": Connect to service, etc...
}
}
私は通常、デザインタイム サービスを使用してデザインタイム データを作成します。
private void DesignMode_CreateSearchResults()
{
this.SearchResults = new ObservableCollection<ReadmitPatientListViewModel>();
this.SearchResults.Add(new ReadmitPatientListViewModel(new ReadmitPatientList()
{
PatientID = 0000000,
PatientName = "Test Patient",
PatientDOB = Convert.ToDateTime("01/01/2010"),
OriginalAdmitDate = Convert.ToDateTime("01/01/2010 00:00:00"),
OriginalReason = "Becauselkahsdfkahsfkahsf",
OriginalVisitNumber = "0000000",
ReAdmitDate = Convert.ToDateTime("01/01/2010 00:00:00"),
ReAdmitReason = ";aasfkahsfashfa;lsfas",
ReAdmitVisitNumber = "9999999"
}
));
this.SearchResults.Add(new ReadmitPatientListViewModel(new ReadmitPatientList()
{
PatientID = 0000000,
PatientName = "Test Patient",
PatientDOB = Convert.ToDateTime("01/01/2010"),
OriginalAdmitDate = Convert.ToDateTime("01/01/2010 00:00:00"),
OriginalReason = "Becauselkahsdfkahsfkahsf",
OriginalVisitNumber = "0000000",
ReAdmitDate = Convert.ToDateTime("01/01/2010 00:00:00"),
ReAdmitReason = ";aasfkahsfashfa;lsfas",
ReAdmitVisitNumber = "9999999"
}
));
this.SearchResults.Add(new ReadmitPatientListViewModel(new ReadmitPatientList()
{
PatientID = 0000000,
PatientName = "Test Patient",
PatientDOB = Convert.ToDateTime("01/01/2010"),
OriginalAdmitDate = Convert.ToDateTime("01/01/2010 00:00:00"),
OriginalReason = "Becauselkahsdfkahsfkahsf",
OriginalVisitNumber = "0000000",
ReAdmitDate = Convert.ToDateTime("01/01/2010 00:00:00"),
ReAdmitReason = ";aasfkahsfashfa;lsfas",
ReAdmitVisitNumber = "9999999"
}
));
SearchResultsCVS_Refresh();
}
private void SearchResultsCVS_Refresh()
{
SearchResultsCVS.Source = this.SearchResults;
SearchResultsCVS.SortDescriptions.Clear();
SearchResultsCVS.SortDescriptions.Add(new System.ComponentModel.SortDescription("PatientLastName", System.ComponentModel.ListSortDirection.Ascending));
SearchResultsCVS.View.Refresh();
}
ViewModels の ObservableCollections を使用します。OC の通知イベントは、コレクションに追加または削除されたアイテムに対してのみ発生します。実際のリスト アイテムの vm を使用して、必要に応じてアイテム プロパティの変更通知を取得します。
また、ViewModelLocator がセットアップされ、正しく定義されていることを確認する必要があります。MVVMLight を使用しているが、MVVMLight の最も強力な機能の一部を使用していない人々の投稿をいくつか見つけました。使用するように設計されたとおりに使用すると、本来のように機能します...私はそれを証明できます.
<!--Global View Model Locator-->
<local:ViewModelLocator x:Key="Locator"
d:IsDataSource="True" />
IsDataSource 属性は Blend にそれを DataTab に配置するように指示していると思います...しかし、私は Datamanipulation にあまり Blend を使用していないので、それほど心配していません。