Я изучаю WPF, таким образом, я - вид n00b в этом. Я видел некоторые примеры о том, как сделать то, что я хочу сделать, но ничто точно...
Вопрос: Я хочу связать Список с ListBox. Я хочу сделать это в XAML, w/o кодирующий в коде позади. Как я могу достигнуть этого?
Прямо сейчас я делаю это тот путь:
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();
}
Но я хочу избавиться от FileList.ItemsSource = files;
и FileList.Items.Refresh();
в коде C#.
Спасибо
Сначала настройте привязку в своем списке:
<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
вместо List
, также. Это позволит привязке правильно обрабатывать добавление или удаление элементов.
Если вы сделаете эти две вещи, все должно работать правильно.
Два приема, которые нужно добавить к ответу Рида:
1) Если все, что вы показываете в элементах окна списка, является строкой, вы можете избежать Папка ListBox.ItemTemplate
, просто установив ListBox.DisplayMemberPath
.
2) Вы можете установить для окна DataContext
самого себя. Например, дайте окну имя MyWindow
и установите для его DataContext
значение {Binding ElementName = MyWindow}
. Теперь вы можете выполнить привязку к любому из его общедоступных свойств. (Я почти уверен, что именно от Рида я научился этому трюку.)