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