Привязка ListBox к списку (коллекции) в XAML - PullRequest
7 голосов
/ 21 апреля 2010

Я изучаю WPF, так что я вроде как n00b в этом. Я видел несколько примеров о том, как делать то, что я хочу делать, но ничего точно ...

Вопрос: я хочу привязать List к ListBox. Я хочу сделать это в XAML, без кодирования в коде позади. Как мне этого добиться?

Прямо сейчас я делаю это таким образом :

1010 * 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 #.

Спасибо

Ответы [ 2 ]

19 голосов
/ 21 апреля 2010

Сначала установите привязку в вашем списке:

<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 (или коде позади). (Вы не можете привязать к полям, только свойства ...)

В идеале, вы также захотите сделать файлы ObservableCollection<T> вместо List<T>. Это позволит привязке правильно обрабатывать добавление или удаление элементов.

Если вы сделаете эти две вещи, все должно работать правильно.

1 голос
/ 21 апреля 2010

Два трюка, которые нужно добавить к ответу Рида:

1) Если все, что вы отображаете в элементах списка, это строка, вы можете избежать папки ListBox.ItemTemplate, просто установив ListBox.DisplayMemberPath.

2) Вы можете установить DataContext окна для себя. Например, дайте окну имя MyWindow и установите его DataContext на {Binding ElementName=MyWindow}. Теперь вы можете привязать к любому из его общедоступных свойств. (Я почти уверен, что Рид - тот, от кого я узнал этот трюк.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...