Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从树视图中获取SelectedItem?_C#_Wpf_Xaml - Fatal编程技术网

C# 如何从树视图中获取SelectedItem?

C# 如何从树视图中获取SelectedItem?,c#,wpf,xaml,C#,Wpf,Xaml,我有一个WPF层次树视图,其中有一个文本块来显示我的列表。我想将选定的字符串值作为参数传递给我的ViewModel。我正在使用MVVM 这是树景: <TreeView ItemsSource="{Binding countryReportsHierarchy}"> <i:Interaction.Triggers> <i:EventTrigger EventName="Selec

我有一个WPF层次树视图,其中有一个文本块来显示我的列表。我想将选定的字符串值作为参数传递给我的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>
   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; }
}

我试图从以下文本块中获取选定值的部分:

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

这将按预期绑定,显然没有选择值。有没有办法传递TextBlock的选定值?我尝试了以下操作,但绑定失败:

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

以下是我解决这个问题的方法。我扩展了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));
}
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)
    }
公共报告视图模型() { countryReportsHierarchy=新的ObservableCollection(新[]{ 新的CountryReportsHierarchy(ISessService){Name=CountryReportTitle}}; } 私人物品类型电子档案(你选择的物品名称);; public Article TypesHierarchy Selected文章标题 { 获取{return\u selectedarticletTitle;} 设置 { _SelectedArticleTitle=值; OnPropertyChanged(“SelectedArticleTitle”); } } 私有无效ArticleCategoryTitleSelectionChangedCommandAction() { GetData(SelectedArticleTitle.Name) }
听起来不对,给我们看更多的代码你想要整个TreeView代码吗?只有2个数据模板,你在这里显示的第一个模板在第一行是关闭的,它本身在textblock中没有SelectedItem,因为它不是项控件。好的,你需要一个行为,看看[here][1]中的示例。[1]:
    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)
    }