我正在学习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();
。
由于
答案 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是我从头开始学习这个技巧的。)