如何从TreeView获取SelectedItem?

时间:2015-03-13 12:19:47

标签: c# wpf xaml

我有一个带有TextBlock的WPF分层TreeView来显示我的列表。我想将选定的字符串值作为参数传递给我的ViewModel。我正在使用MVVM。

这是TreeView:

 <TreeView ItemsSource="{Binding countryReportsHierarchy}">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="SelectedItemChanged">
                            <i:InvokeCommandAction Command="{Binding ArticleCategoryTitleSelectionChangedCommand}" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                    <TreeView.Resources>
                        <HierarchicalDataTemplate  DataType="{x:Type t:CountryReportsHierarchy}"
                                ItemsSource="{Binding ArticleCategoriesHierarchyCollection}">
                            <TextBlock Text="{Binding Name}" />
                        </HierarchicalDataTemplate>
                        <HierarchicalDataTemplate  DataType="{x:Type t:ArticleCategoriesHierarchy}"
                                ItemsSource="{Binding ArticleTypesHierarchyCollection}">
                            <TextBlock Text="{Binding Name}"/>
                        </HierarchicalDataTemplate>
                        <DataTemplate  DataType="{x:Type t:ArticleTypesHierarchy}">
                            <TextBlock Text="{Binding ElementName= Name, Path=SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >
                            </TextBlock>
                        </DataTemplate>
                    </TreeView.Resources>
                </TreeView>

我尝试从TextBlock中选择的部分来自:

<TextBlock Text="{Binding Name}"/>                         

这与预期结合,显然没有选定的值。有没有办法传递TextBlock的选定值?我尝试了以下但绑定失败了:

<TextBlock Text="{Binding ElementName= Name, Path=SelectedItem" />

1 个答案:

答案 0 :(得分:0)

以下是我解决这个问题的方法。我扩展了TreeView类以包含SelectedItem功能:

public class ExtendedTreeView : TreeView
{
    public ExtendedTreeView()
        : base()
    {
        this.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(___ICH);
    }

    void ___ICH(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        if (SelectedItem != null)
        {
            SetValue(SelectedItem_Property, SelectedItem);
        }
    }

    public object SelectedItem_
    {
        get { return (object)GetValue(SelectedItem_Property); }
        set { SetValue(SelectedItem_Property, value); }
    }
    public static readonly DependencyProperty SelectedItem_Property = DependencyProperty.Register("SelectedItem_", typeof(object), typeof(ExtendedTreeView), new UIPropertyMetadata(null));
}

以下是TreeView的层次结构类:

   public class CountryReportsHierarchy
{
    IIsesServiceChannel IsesService;
    public ObservableCollection<tbArticleCategory> ArticleCategoryList;

    public ObservableCollection<ArticleCategoriesHierarchy> ArticleCategoriesHierarchyCollection { get; set; }
    public string Name { get; set; }

    public CountryReportsHierarchy(IIsesServiceChannel isesService)
    {
        this.IsesService = isesService;          
        ArticleCategoryList = new ObservableCollection<tbArticleCategory>(IsesService.GetArticleCatagoryTitles());           

        ArticleCategoriesHierarchyCollection = new ObservableCollection<ArticleCategoriesHierarchy>();

        foreach (var a in ArticleCategoryList)
        {
            ArticleCategoriesHierarchyCollection.Add(new ArticleCategoriesHierarchy(IsesService, a.Category) { Name = a.CategoryTitle });
        }
    } 
}

public class ArticleCategoriesHierarchy
{
    IIsesServiceChannel IsesService;

    public ObservableCollection<tbArticleType> ArticleTypeList;
    public ObservableCollection<ArticleTypesHierarchy> ArticleTypesHierarchyCollection { get; set; }
    public string Name { get; set; }
    public ArticleCategoriesHierarchy(IIsesServiceChannel isesService, string articleCategoryType)
    {
        this.IsesService = isesService;

        ArticleTypeList = new ObservableCollection<tbArticleType>(IsesService.GetArticleCategoryTypes(articleCategoryType));

        ArticleTypesHierarchyCollection = new ObservableCollection<ArticleTypesHierarchy>();

        foreach (var a in ArticleTypeList)
        {
            ArticleTypesHierarchyCollection.Add(new ArticleTypesHierarchy() { Name = a.ArticleTitle });
        }
    }
}

public class ArticleTypesHierarchy
{
    public string Name { get; set; }
}

然后我将新的ExtendedTreeView Selected项绑定到我的ViewModel中的ArticleTypesHierarchy属性:

 <cntrls:ExtendedTreeView ItemsSource="{Binding countryReportsHierarchy}" SelectedItem_="{Binding SelectedArticleTitle, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >                       
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="SelectedItemChanged">
                            <i:InvokeCommandAction Command="{Binding ArticleCategoryTitleSelectionChangedCommand}" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                    <TreeView.Resources>
                        <HierarchicalDataTemplate  DataType="{x:Type t:CountryReportsHierarchy}"
                                ItemsSource="{Binding ArticleCategoriesHierarchyCollection}">
                            <TextBlock Text="{Binding Name}" />
                        </HierarchicalDataTemplate>
                        <HierarchicalDataTemplate  DataType="{x:Type t:ArticleCategoriesHierarchy}"
                                ItemsSource="{Binding ArticleTypesHierarchyCollection}">
                            <TextBlock Text="{Binding Name}"/>
                        </HierarchicalDataTemplate>
                        <DataTemplate  DataType="{x:Type t:ArticleTypesHierarchy}">                              
                            <TextBlock Text="{Binding Name}" />                  
                        </DataTemplate>
                    </TreeView.Resources>
                </cntrls:ExtendedTreeView>

ViewModel传入ArticleTypesHierarchy.Name(我选择的TreeView字符串)参数:

    public ReportViewModel()
    {
        countryReportsHierarchy = new ObservableCollection<CountryReportsHierarchy>(new[]{
        new CountryReportsHierarchy(IsesService){Name = CountryReportTitle}});
    }


  private ArticleTypesHierarchy _SelectedArticleTitle;
    public ArticleTypesHierarchy SelectedArticleTitle
    {
        get { return _SelectedArticleTitle; }
        set
        {
            _SelectedArticleTitle = value;
            OnPropertyChanged("SelectedArticleTitle");
        }
    }      

    private void ArticleCategoryTitleSelectionChangedCommandAction()
    {
        GetData(SelectedArticleTitle.Name)
    }