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绑定工作良好,我有一个酒吧。显示名称,但列表框为空。请解释一下,我该怎么做?

Wpf ListBox数据绑定显示TreeViewItem详细信息

你将你的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接口以允许绑定自动更新