Prism と MVVM を使用して TreeView を構築しようとすると、かなりの問題が発生します。アプリケーションをリージョンに分割しています。このリージョンの 1 つには TreeView を含むモジュールがあり、別のリージョンには、ある種のプロジェクトを作成および構成できるモジュールとしてリボンがあります。これらの領域はプリズムを使用して伝達され、完全に機能します。そのため、プロジェクトが「リボン モジュール」で作成されると、「TreeView モジュール」がそれを取得し、ここで問題が発生します。
「TreeView モジュール」の ViewModel には、すべてのプロジェクトを追加する必要がある ObservableCollection があります。プロジェクトの名前とこのクラスのその他のプロパティは、TreeView に表示されます。
public class Project : BindableBase
{
private List<DataSet> _DataSetList;
private string _projectName;
public Project()
{
DataSetList = new List<DataSet>();
ProjectName = "";
}
public Project(string projectName, List<DataSet> dataSets)
{
ProjectName = projectName;
DataSetList = dataSets;
}
public string ProjectName
{
get { return _projectName; }
set { SetProperty(ref this._projectName, value); }
}
public List<DataSet> DataSetList
{
get { return _DataSetList; }
set { SetProperty(ref this._DataSetList, value); }
}
public bool CheckForLoadedDataSets()
{
foreach (DataSet ds in DataSetList)
{
if(ds.Status != DataSet.DataSetStatus.Loaded)
{
return false;
}
}
return true;
}
}
これがDataSetとは
public class DataSet : BindableBase
{
public enum DataSetStatus
{
Loaded,
Stopped,
Unloaded,
Empty,
LoadingData,
CorruptData,
};
private string _dataSetSource;
private DataSetStatus _status;
public DataSet(string name, string sourceName, List<Injector> injertors)
{
DataSetName = name;
DataSetSource = sourceName;
Injectors = injertors;
Status = DataSetStatus.Empty;
}
public DataSet(string name, string sourceName)
{
DataSetName = name;
DataSetSource = sourceName;
Injectors = new List<Injector>();
Status = DataSetStatus.Empty;
}
public DataSet(string sourceName)
{
DataSetName = "";
DataSetSource = sourceName;
Injectors = new List<Injector>();
Status = DataSetStatus.Empty;
}
public string DataSetName { get; set; }
public string DataSetSource { get { return _dataSetSource; } set { SetProperty(ref this._dataSetSource, value); } }
public List<Injector> Injectors { get; set; }
public DataSetStatus Status { get { return _status;} set{ SetProperty(ref this._status,value);} }
}
これは TreeViewViewModel です
class TreeProjectManagerViewModel : BindableBase, INavigationAware
{
private ObservableCollection<Project> _projectCollection;
public ObservableCollection<Project> Projects
{
get { return this._projectCollection; }
set
{
SetProperty(ref this._projectCollection, value);
}
}
public TreeProjectManagerViewModel()
{
Projects = new ObservableCollection<Project>();
}
/// <summary>
/// Checking parameters
/// </summary>
/// <param name="navigationContext"></param>
/// <returns></returns>
public bool IsNavigationTarget(NavigationContext navigationContext)
{
if (navigationContext.Parameters["ProjectObject"] != null)
{
return true;
}
return false;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
/// <summary>
/// Getting information from other module
/// </summary>
/// <param name="navigationContext"></param>
public void OnNavigatedTo(NavigationContext navigationContext)
{
Project p = (Project)navigationContext.Parameters["ProjectObject"];
Projects.Add(p);
}
}
そして、ここでビューのコード
<Grid>
<TreeView ItemsSource="{Binding Projects}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Projects}">
<TextBlock Text="{Binding Path=ProjectName}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Grid>
これにより、TreeView でプロジェクトの名前を取得できますが、たとえば、ここに私の質問があります。
1.- 各 DataSet の名前を持つ TreeNode の 2 番目の階層を取得するにはどうすればよいですか?
2.- TreeView でイベントを管理するにはどうすればよいですか?
事前にどうもありがとうございました。