繁体   English   中英

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

[英]Wpf ListBox data binding to display TreeViewItem details

我正在使用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绑定工作正常,我显示了Bar.Name,但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的源项都绑定到该属性,至少这样可以将断点放在设置器等中,并确保您的前端控件正确触发。 不过,这样做的问题在于您似乎不支持IPropertyChange通知(如果您不知道那是什么,那么请删除正在执行的操作,然后再继续使用Google,然后再继续操作)。

您可以通过将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}"/>

可悲的是,树视图的选定项目是只读属性,因此您无法在视图中轻松创建属性并将列表框和树视图绑定到该属性。

你也应该改变你的人口

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM