【问题标题】:How do I get SelectedItem from a TreeView?如何从 TreeView 中获取 SelectedItem?
【发布时间】:2015-05-15 22:15:48
【问题描述】:

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

这是树视图:

 <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" />

【问题讨论】:

  • 听起来不对,给我们看更多代码
  • 您想要整个 TreeView 代码?
  • 只有2个数据模板,你在这里显示的第一个在第一行本身就关闭了
  • 文本块中没有SelectedItem,因为它不是itemscontrol
  • 那么你需要一个行为,看看 [这里][1] 的示例。 [1]:stackoverflow.com/questions/11065995/…

标签: c# wpf xaml


【解决方案1】:

这就是我解决这个问题的方法。我扩展了 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>

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

    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)
    }

【讨论】:

    猜你喜欢
    • 2010-11-17
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2012-12-09
    • 2013-04-25
    • 2011-11-01
    • 1970-01-01
    相关资源
    最近更新 更多