我有一个带有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" />
答案 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)
}