在XAML中将ListBox绑定到List(集合)

7

我正在学习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();

谢谢


1
这个线程可能会对你有所帮助。https://dev59.com/Ymox5IYBdhLWcg3wKBN9 - FebinDonz
2个回答

20

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

<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="."/>

接下来,请确保 "Files" 是您的 DataContext (或代码后台) 中的一个属性。(只能绑定到属性,而不能绑定到字段...)

最好将 Files 作为一个ObservableCollection<T>而不是一个List<T>。这将允许绑定正确处理添加或删除元素。

如果您完成了这两件事情,它应该就可以正确地工作了。


谢谢。下一步[对我来说]将是学习如何创建ObservableList<T>:INotifyCollectionChanged,INotifyPropertyChanged - David
有没有办法剪掉<DataTemplate>部分?并像这样使用`ItemsSource="{Binding Files.PROPERTY}">? - Squirrel in training
@Nerdintraining 如果你只是绑定一个字符串(或者看起来可以转换为字符串的东西),你可以使用 DisplayMemberPath。 - Reed Copsey

1

对Reed的答案添加两个技巧:

1)如果您在列表框中显示的只是一个字符串,您可以通过设置ListBox.DisplayMemberPath来避免使用ListBox.ItemTemplate

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


谢谢。这是一个有趣的方法,我一定会使用它。 - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接