首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TreeView和Prism-5的问题

TreeView和Prism-5的问题
EN

Stack Overflow用户
提问于 2015-03-09 23:33:13
回答 1查看 555关注 0票数 0

我在尝试使用棱镜和MVVM构建TreeView时遇到了相当多的问题。我将我的应用程序划分为几个区域,其中一个区域有一个带有TreeView的模块,另一个区域有一个功能区作为模块,可以在其中创建和配置某种项目。这些区域是使用棱镜进行通信的,而且工作得很好。因此,当在"Ribbon模块“中创建一个项目时,"TreeView模块”就会得到它,问题就出现在这里。

"TreeView模块“的ViewModel有一个应该添加所有项目的ObservableCollection。项目的名称和该类的其他属性应该显示在TreeView中。

代码语言:javascript
复制
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的含义

代码语言:javascript
复制
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

代码语言:javascript
复制
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);
    }
}

这里是视图中的代码

代码语言:javascript
复制
<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的名称获取TreeNodes的第二个层次结构?

2.-如何管理TreeView中的事件?

非常提前感谢您。

EN

回答 1

Stack Overflow用户

发布于 2015-03-09 23:51:20

试试这样的东西:

代码语言:javascript
复制
<TreeView ItemsSource="{Binding Projects}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Loaded">
            <ie:CallMethodAction MethodName="OnTreeviewLoaded" TargetObject="{Binding}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate DataType="{x:Type model:Project}" ItemsSource="{Binding Path=DataSetList}">
            <TextBlock Text="{Binding Path=ProjectName}" />
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type model:DataSet}">
            <TextBlock Text="{Binding Path=DataSetName}" />
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

您还需要添加:

代码语言:javascript
复制
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ie="http://schemas.microsoft.com/expression/2010/interactions"

添加到xaml中并在视图模型中创建事件处理程序

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28945878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档