gpt4 book ai didi

c# - Wpf ListBox 数据绑定(bind)显示 TreeViewItem 细节

转载 作者:太空宇宙 更新时间:2023-11-03 15:34:32 28 4
gpt4 key购买 nike

我正在使用 WPF 并在我的表单绑定(bind)到模型上有一个 TreeView。对象具有属性,我想将所选项目(在 TreeView 中)属性绑定(bind)到列表框,但我不知道该怎么做。我的代码是:

酒吧类:

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 绑定(bind)工作正常,我显示了一个 Bar.Name,但 ListBox 是空的。请解释一下,我该怎么办?

最佳答案

您正在将您的列表框绑定(bind)到 Name,因此它试图在您的 Bar 类中找到一个名为“Name”的属性。我相信您实际上想做的是显示当前在 TreeView 中选择的项目的属性。所以绑定(bind)到 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 的源项目绑定(bind)到该属性,这样在至少你可以在 setter 等中放置断点,并确保你的前端控件正确触发。不过,这样做的问题是您似乎不支持 IPropertyChange 通知(如果您不知道那是什么,那么请放弃您正在做的事情并在继续之前先点击 Google)。

关于c# - Wpf ListBox 数据绑定(bind)显示 TreeViewItem 细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32305917/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com