2010-04-20 14 views
7

Estoy aprendiendo WPF, así que estoy algo así como n00b en esto. Vi algunos ejemplos sobre cómo hacer lo que quiero hacer, pero nada exactamente ...Encuadernación ListBox a List (Colección) en XAML

La pregunta: Quiero unir List al ListBox. Quiero hacerlo en XAML, sin codificación en el código. ¿Cómo puedo lograr eso?

Ahora mismo lo hago de esa manera:

XAML

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

Código detrás

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(); 
} 

Pero quiero para deshacerse de FileList.ItemsSource = files; y FileList.Items.Refresh(); en C# código.

Gracias

+1

este hilo puede ayudarte. http://stackoverflow.com/questions/9391746/how-can-i-data-bind-a-list-of-strings-to-a-listbox-in-wpf-wp7 – FebinDonz

Respuesta

17

En primer lugar, la configuración de la unión en su cuadro de lista:

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

o

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

A continuación, haga "archivos" seguro que es un propiedad en su DataContext (o código detrás). (No puede enlazar a campos, solo propiedades ...)

Lo ideal es que también desee hacer que los archivos sean ObservableCollection<T> en lugar de List<T>. Esto permitirá que el enlace maneje la adición o eliminación de elementos correctamente.

Si hace estas dos cosas, debería funcionar correctamente.

+0

Gracias. El próximo paso [para mí] será aprender a crear 'ObservableLis : INotifyCollectionChanged, INotifyPropertyChanged' – David

+0

¿Hay alguna forma de eliminar la parte ? y como ir 'ItemsSource =" {Binding Files.PROPERTY} ">? –

+0

@Nerdintraining Puede usar DisplayMemberPath si solo está vinculando una cadena (o algo que se ve bien convertido en una cadena) –

2

Dos trucos para añadir a la respuesta de Reed:

1) Si todo lo que está mostrando en sus elementos de cuadro de lista es una cadena, se puede evitar la folderol ListBox.ItemTemplate por sólo la creación de ListBox.DisplayMemberPath.

2) Puede establecer el DataContext de la ventana a sí mismo. Por ejemplo, asigne a la ventana un nombre de MyWindow y establezca su DataContext en {Binding ElementName=MyWindow}. Ahora puede enlazar a cualquiera de sus propiedades públicas. (Estoy bastante seguro de que Reed es quien aprendí ese truco desde el principio).

+0

Gracias. Es un enfoque interesante y seguramente lo usaré. – David

Cuestiones relacionadas