我试图TreeView绑定我的集合,以便所有组显示嵌套组,每个组将显示条目.
我如何使用HierarchicalDataTemplate它TreeView来处理子组和条目集合?
组显示子组和条目:
Example:
Group1
--Entry
--Entry
Group2
--Group4
----Group1
------Entry
------Entry
----Entry
----Entry
--Entry
--Entry
Group3
--Entry
--Entry
Run Code Online (Sandbox Code Playgroud)
namespace TaskManager.Domain
{
public class Entry
{
public int Key { get; set; }
public string Name { get; set; }
}
}
namespace TaskManager.Domain
{
public class Group
{
public int Key { get; set; }
public string Name { get; set; }
public IList<Group> SubGroups { get; set; }
public IList<Entry> Entries …Run Code Online (Sandbox Code Playgroud) 我对WPF Treeview Binding有一些复杂的情况.我花了最近两天的时间尝试谷歌,这是我提出的关闭,但它没有解决问题.
情况如下:
我有一个看起来像这样的对象:
public class Category
{
public string Name { get; set; }
public List<Category> Categories { get; set; }
public List<Product> Products { get; set; }
}
public class Product
{
public string Name { get; set;
}
Run Code Online (Sandbox Code Playgroud)
每个类别都可以包含对象列表和子类别.我有理由这样做对我和我正在写的应用程序完全有意义.
实际的对象构造可能看起来像这样:
Category - Pharmacy
|-Product - Aspirin
|-Product - Tylenol
|-Category - Tooth Paste
| |-Product - Crest
| |-Product - Colgate
|-Category - Paper Products
|-Category - Toilet Paper
| |-Product - NoName
| …Run Code Online (Sandbox Code Playgroud) wpf treeview binding hierarchicaldatatemplate hierarchical-data
我有一个TreeView使用a HierarchicalDataTemplate绑定其数据.
它看起来像这样:
<TreeView x:Name="mainTreeList" ItemsSource="{Binding MyCollection}>
<TreeView.Resources>
<HierarchicalDataTemplate
DataType="{x:Type local:MyTreeViewItemViewModel}"
ItemsSource="{Binding Children}">
<!-- code code code -->
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
Run Code Online (Sandbox Code Playgroud)
现在,从主窗口的代码隐藏,我想得到当前选择TreeViewItem.但是,如果我使用:
this.mainTreeList.SelectedItem;
Run Code Online (Sandbox Code Playgroud)
selectedItem属于类型MyTreeViewItemViewModel.但我想得到'父母'或'约束' TreeViewItem.我没有把它传递给我的TreeViewItemModel对象(甚至不知道如何).
我怎样才能做到这一点?
对于我的treeview,我有两个不同的类提供ItemsSource.
public class TreeViewModel : ViewModelBase
{
public ObservableCollection<NodeViewModel> Items { get; set; }
}
public class NodeViewModel : ViewModelBase
{
public string Id { get; set; }
public string Name { get; set; }
public ObservableCollection<NodeViewModel> Children { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在我希望我的TreeView在TreeViewModel中显示Items并显示NodeViewModel提供的分层数据.
这是我的XAML
<Window x:Class="TreeViewMasterDetails.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TreeViewMasterDetails"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TreeView Height="Auto"
HorizontalAlignment="Stretch"
Margin="10"
VerticalAlignment="Stretch"
Width="Auto">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="x:Type local:TreeViewModel" ItemsSource="{Binding Items}">
<TextBlock Text="{Binding Path=Name}"></TextBlock>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="x:Type local:NodeViewModel" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}"></TextBlock>
</HierarchicalDataTemplate>
</TreeView.Resources> …Run Code Online (Sandbox Code Playgroud) 我有一个数据绑定TreeView,我想绑定SelectedItem.这种附加的行为工作完全没有HierarchicalDataTemplate,但与它连接的行为只能单向(UI数据)不是别的,因为现在e.NewValue是MyViewModel不是TreeViewItem.
这是附加行为的代码段:
private static void OnSelectedItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var item = e.NewValue as TreeViewItem;
if (item != null)
{
item.SetValue(TreeViewItem.IsSelectedProperty, true);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的TreeView定义:
<Window xmlns:interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity">
<TreeView ItemsSource="{Binding MyItems}" VirtualizingStackPanel.IsVirtualizing="True">
<interactivity:Interaction.Behaviors>
<behaviors:TreeViewSelectedItemBindingBehavior SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />
</interactivity:Interaction.Behaviors>
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:MyViewModel}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
</Window>
Run Code Online (Sandbox Code Playgroud)
如果我可以获得TreeView对附加行为方法的引用OnSelectedItemChanged,也许我可以使用此问题中的答案来获取TreeViewItem但我不知道如何到达那里.有谁知道如何以及它是正确的方式去?
data-binding wpf treeview hierarchicaldatatemplate treeviewitem
我有一个树形控件表现出非常差的性能,我试图跟踪问题的根源.
我想弄清楚以下警告是否重要:
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=ContextMenu.IsOpen; DataItem=null; target element is 'MultipleSelectionTreeViewItem' (Name=''); target property is 'NoTarget' (type 'Object')
Run Code Online (Sandbox Code Playgroud)
即使关闭所有这些diags,更新树内容的性能也非常可怕(超过一秒钟重新填充~300项),这就是我开始查看跟踪输出的原因.
在我的树视图中,每次单击时都会显示这些警告,当我切换树以显示不同的内容时,会发生数百个警告.但是,树的内容始终显示正确显示,因此数据上下文必须仅暂时设置为null.
我对DataContext值转换器进行了显式绑定,以尝试查看发生了什么.
<HierarchicalDataTemplate x:Key="HierarchyItemTemplate"
DataType="{x:Type local:HierarchyItem}"
ItemsSource="{Binding Children}">
<StackPanel DataContext="{Binding Converter={StaticResource DbgConverter}}" Orientation="Horizontal">
...
</StackPanel>
</HierarchicalDataTemplate>
Run Code Online (Sandbox Code Playgroud)
...但是值似乎永远不等于null进入那里.
我可以为所有绑定设置一个回退值来摆脱这些警告,但这会在xaml中造成很多不必要的混乱,并且似乎隐藏了问题而不是解决它(假设它甚至是一个问题!).
所以我的问题是:
编辑
使用回退值看起来似乎不是解决方案,因为它也无法找到资源:
System.Windows.ResourceDictionary Warning: 9 : Resource not found; ResourceKey='Img_Folder_Closed_Ex'
Run Code Online (Sandbox Code Playgroud)
这就像它忘记了资源字典中的所有内容,生成所有这些虚假错误,然后再次记住它并显示确定.
编辑
好吧,我已经通过评论所有绑定并将它们一个接一个地放回原点来解决这个问题并解决问题,所以现在加载它我可以点击这些项目并且不会产生任何诊断直到..当我点击更改树项目的按钮时,它会变得疯狂并喷出数百个错误.以下是错误的一小部分:
System.Windows.Data Information: 21 : BindingExpression cannot retrieve value …Run Code Online (Sandbox Code Playgroud) 我有一组Database对象,每个对象都包含Schema对象和User对象的集合.我想将它们绑定到TreeView,但在层次结构中添加其他静态级别,以便生成的TreeView看起来或多或少像这样:
<TreeView>
<TreeViewItem Header="All the databases:">
<TreeViewItem Header="Db1">
<TreeViewItem Header="Here's all the schemas:">
<TreeViewItem Header="Schema1"/>
<TreeViewItem Header="Schema2"/>
</TreeViewItem>
<TreeViewItem Header="Here's all the users:">
<TreeViewItem Header="User1"/>
<TreeViewItem Header="User2"/>
</TreeViewItem>
</TreeViewItem>
<TreeViewItem Header="Db2">
<TreeViewItem Header="Here's all the schemas:">
<TreeViewItem Header="Schema1"/>
<TreeViewItem Header="Schema2"/>
</TreeViewItem>
<TreeViewItem Header="Here's all the users:">
<TreeViewItem Header="User1"/>
<TreeViewItem Header="User2"/>
</TreeViewItem>
</TreeViewItem>
</TreeViewItem>
</TreeView>
Run Code Online (Sandbox Code Playgroud)
通过使用以下模板,我能够非常接近我想要的东西:
<Window.Resources>
<HierarchicalDataTemplate DataType="{x:Type smo:Database}">
<TreeViewItem Header="{Binding Path=Name}">
<TreeViewItem Header="Here's all the schemas:" ItemsSource="{Binding Path=Schemas}"/>
<TreeViewItem Header="Here's all the users:" …Run Code Online (Sandbox Code Playgroud) 有没有办法在一个TreeView's中指定HierarchicalDataTemplate使用不同的ContextMenu取决于项目绑定的数据的属性?
例如,ContextMenu如果Item.IsFile为真则显示一个,如果为真则显示不同的一个Item.IsFolder,等等.
data-binding wpf treeview contextmenu hierarchicaldatatemplate
是否可以在MultiBinding中将Converter绑定添加到ConverterParameter?像这样的东西:
<HierarchicalDataTemplate DataType="{x:Type Elements:RootElement}">
<HierarchicalDataTemplate.ItemsSource>
<MultiBinding Converter="{StaticResource filterConverter}" ConverterParameter="{Binding IsFilterd}">
<Binding Path="Children"/>
<Binding Path="FilterChildren"/>
</MultiBinding>
</HierarchicalDataTemplate.ItemsSource>
<TextBlock Text="{Binding Name}" FontWeight="Normal"/>
</HierarchicalDataTemplate>
Run Code Online (Sandbox Code Playgroud)
IsFiltered是应用模板的对象上的属性.我总是得到一个XAML解析器错误,在ConverterParameter中Binding不正确/允许...或者还有其他方法可以做到这一点?
映入眼帘,
于尔根
我只有两个星期的WPF,所以这可能是一个微不足道的问题.我有一个集合"CellList",它有一些我希望绑定到的属性,ToolTip所以当我将鼠标悬停在CellList显示的当前实例的标签信息上时.我怎么做?我理解简单的绑定,这也许是简单的绑定,但我无法绕过它.下面是我的XAML标签.有人可以向我解释我是如何做到这一点的.
<HierarchicalDataTemplate>
<ListBox ItemsSource="{Binding CellList}">
<ListBox.ItemTemplate>
<DataTemplate>
<Label Content=" " Height="20" Width="15" Background="{Binding Path=ExptNameBkg, Converter={StaticResource ExptNameToBrushConverter}}" BorderBrush="Black" BorderThickness="1" >
</Label>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</HierarchicalDataTemplate>
Run Code Online (Sandbox Code Playgroud)
谢谢.
wpf ×10
treeview ×7
data-binding ×6
c# ×2
binding ×1
contextmenu ×1
multibinding ×1
performance ×1
tooltip ×1
treeviewitem ×1
xaml ×1