2015-03-13 3 views
0

У меня есть иерархический TreeView WPF с TextBlock, чтобы показать мой список. Я хочу передать выбранное строковое значение в качестве параметра в мой ViewModel. Я использую MVVM.Как получить SelectedItem из TreeView?

Вот 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" /> 
+0

не звучит правильно, покажите нам еще код – Muds

+0

Вам нужен код TreeView? – Hardgraf

+0

всего 2 шаблона данных, первый из которых показан здесь, закрыт в самой первой строке – Muds

ответ

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 элемент ArticleTypesHierarchy собственности в моем ViewModel:

<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) 
    } 
Смежные вопросы