将ListBox绑定到XAML中的List(Collection)

时间:2010-04-20 20:33:15

标签: c# wpf xaml wpf-controls binding

我正在学习WPF,所以我对此非常感兴趣。 我看到了一些关于如何做我想做的事的例子,但没有确切地说......

问题:我想将List绑定到ListBox。我想在XAML中完成它,没有编码后面的代码。我怎样才能做到这一点?

现在我按照那样做

XAML

<ListBox x:Name="FileList">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Label Content="{Binding Path=.}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

代码

public MainWindow()
{
    // ...
    files = new List<string>();
    FileList.ItemsSource = files;
}

private void FolderBrowser_TextChanged(object sender, RoutedEventArgs e)
{
    string folder = FolderBrowser.Text;
    files.Clear();
    files.AddRange(Directory.GetFiles(folder, "*.txt", SearchOption.AllDirectories));
    FileList.Items.Refresh();
}

但我希望摆脱C#代码中的FileList.ItemsSource = files;FileList.Items.Refresh();

由于

2 个答案:

答案 0 :(得分:18)

首先,在列表框中设置绑定:

<ListBox x:Name="FileList" ItemsSource="{Binding Files}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Label Content="{Binding Path=.}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

<ListBox x:Name="FileList" ItemsSource="{Binding Files}" DisplayMemberPath="."/>

接下来,确保DataContext(或后面的代码)中的“Files”是属性。 (你不能绑定到字段,只能绑定属性......)

理想情况下,您还希望将文件设为ObservableCollection<T>而不是List<T>。这将允许绑定正确处理添加或删除元素。

如果你做这两件事,它应该正常工作。

答案 1 :(得分:1)

两个技巧可以添加到里德的答案中:

1)如果您在列表框项目中显示的所有内容都是字符串,则只需设置ListBox.ItemTemplate即可避免使用ListBox.DisplayMemberPath文件夹。

2)您可以将窗口的DataContext设置为自身。例如,为窗口命名为MyWindow,并将其DataContext设置为{Binding ElementName=MyWindow}。现在您可以绑定到它的任何公共属性。 (我很确定Reed是我从头开始学习这个技巧的。)