0

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 でイベントを管理するにはどうすればよいですか?

事前にどうもありがとうございました。

4

1 に答える 1