Wpf ListBox数据绑定显示TreeViewItem详细信息
本文关键字:TreeViewItem 详细信息 显示 数据绑定 ListBox Wpf | 更新日期: 2023-09-27 18:10:25
我正在使用WPF,并在我的表单绑定到模型上有一个TreeView。对象有属性,我想绑定一个选定的项目(在树视图)属性到列表框,但我不知道如何做到这一点。我的代码是:
酒吧类:
public class Bar
{
string barName;
List<bar> children;
List<Foo> attrs;
public string BarName
{
get { return barName; }
set { barName = value; }
}
public List<Folder> Children
{
get { return children; }
set { children = value; }
}
public List<Foo> Attributes
{
get { return attrs; }
set { attrs = value; }
}
public Bar(string name)
{
barName = name;
children = new List<Bar>();
attrs = new List<Foo>();
attrs.Add(new Foo { Name = "Attr1: " + name });
attrs.Add(new Foo { Name = "Attr2: " + name });
attrs.Add(new Foo { Name = "Attr3: " + name });
}
}
Foo类:
public class Foo
{
public string Name { get; set; }
}
填充模型:
Bar bar = new Folder("bar1");
bar.Children.Add(new Bar("bar1.1"));
bar.Children[0].Children.Add(new Bar("bar1.1.1"));
bar.Children.Add(new Bar("bar2"));
this.DataContext = bar;
还有XAML:
<Window.Resources>
<ResourceDictionary>
<HierarchicalDataTemplate DataType="{x:Type local:Bar}"
ItemsSource="{Binding Children}">
<Grid Margin="5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="16"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding BarName}"
Foreground="Black"
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Grid.Column="1"/>
</Grid>
</HierarchicalDataTemplate>
</ResourceDictionary>
</Window.Resources>
<Grid>
<TreeView Height="162" HorizontalAlignment="Left" Margin="203,0,0,0" Name="treeView1" VerticalAlignment="Top" Width="288" ItemsSource="{Binding Children}"/>
<ListBox Height="100" HorizontalAlignment="Left" Margin="203,168,0,0" Name="listBox2" VerticalAlignment="Top" Width="288" ItemsSource="{Binding Name}"/>
</Grid>
现在TreeView绑定工作良好,我有一个酒吧。显示名称,但列表框为空。请解释一下,我该怎么做?
你将你的listbox绑定到Name,所以它试图在你的Bar类中找到一个名为"Name"的属性。我相信你实际上要做的是显示当前在TreeView中被选中的项目的属性。所以绑定到TreeView的SelectedItem,并将DisplayMemberPath设置为"Name":
<ListBox Height="100" HorizontalAlignment="Left" Margin="203,168,0,0" Name="listBox2" VerticalAlignment="Top" Width="288" ItemsSource="{Binding SelectedItem.Attributes, ElementName=treeView1}" DisplayMemberPath="Name"/>
这将工作,但一个更好的想法是在您的Bar类中为当前选中的项目创建一个成员(例如:"CurrentTreeItem"),并将树列表的SelectedItem和ListBox的源项绑定到该属性,这样至少你可以在setter等中设置断点,并确保你的前端控件正确启动。这样做的问题是,虽然你似乎不支持IPropertyChange通知(如果你不知道那是什么,然后放下你正在做什么,然后再去任何进一步的谷歌)。
通过将xaml更改为
,可以将列表框直接绑定到TreeView选定项 <TreeView Height="162" HorizontalAlignment="Left" Margin="203,0,0,0" Name="treeView1" VerticalAlignment="Top" Width="288" ItemsSource="{Binding Source}" />
<ListBox DisplayMemberPath="Name" Height="100" HorizontalAlignment="Left" Margin="203,168,0,0" Name="listBox2" VerticalAlignment="Top" Width="288" ItemsSource="{Binding Path=SelectedItem.Attributes, ElementName=treeView1}"/>
遗憾的是,树视图的选择项是只读属性,所以你不能轻易地在视图中创建一个属性并将listbox和treeview都绑定到它。
你也应该把你的人口改成
public ObservableCollection<Bar> Source { get; set; }
public MainWindow()
{
InitializeComponent();
Bar bar = new Bar("bar1");
bar.Children.Add(new Bar("bar1.1"));
bar.Children[0].Children.Add(new Bar("bar1.1.1"));
bar.Children.Add(new Bar("bar2"));
Source = new ObservableCollection<Bar>() { bar };
this.DataContext = this;
}
请注意,您必须实现INotifyPropertyChanged接口以允许绑定自动更新