2010-06-14 4 views
2

J'apprends WPF et aimerais avoir une collection semblable à une LinkedList, à l'endroit où je peux ajouter et enlever des chaînes. Et je veux avoir un ListView qui écoute cette collection avec la liaison de données. Comment puis-je lier une simple collection de listes à un ListView en XAML?Comment lier une liste en tant que ItemSource à ListView en XAML?

Mon idée (ne fonctionne pas) est quelque chose comme ceci:

<Window x:Class="TestApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <LinkedList x:Key="myList"></LinkedList> //Wrong 
    <Window.Resources> 
    <Grid> 
    <ListView Height="100" HorizontalAlignment="Left" Margin="88,134,0,0" 
     Name="listView1" VerticalAlignment="Top" Width="120" 
     ItemsSource="{Binding Source={StaticResource myList}}"/> //Wrong 
    </Grid> 
</Window> 

Tout mon code (version mise à jour, ne fonctionne pas):

<Window x:Class="TestApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <TextBox Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" 
      Name="textBox1" VerticalAlignment="Top" Width="120" /> 
     <Button Content="Button" Height="23" HorizontalAlignment="Right" 
      Margin="0,12,290,0" Name="button1" VerticalAlignment="Top" Width="75" 
      Click="button1_Click" /> 
     <ListView Height="100" HorizontalAlignment="Left" Margin="88,134,0,0" 
      Name="listView1" VerticalAlignment="Top" Width="120" 
      ItemsSource="{Binding myList}"/> 
    </Grid> 
</Window> 

code C#:

namespace TestApp 
{ 
    public partial class MainWindow : Window 
    { 
     ObservableCollection<string> myList = new ObservableCollection<string>(); 
     public MainWindow() 
     { 
      InitializeComponent(); 
      myList.Add("first string"); 
     } 

     private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      myList.Add(textBox1.Text); 
      textBox1.Text = myList.Count+"st"; 
     } 
    } 
} 

Répondre

4

Vous pouvez uniquement consulter les propriétés publiques et vous devez définir DataContext.

public partial class MainWindow : Window 
{ 
    public ObservableCollection<string> myList { get; private set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 

     myList = new ObservableCollection<string>(); 
     myList.Add("first string"); 
     DataContext = this; 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     myList.Add(textBox1.Text); 
     textBox1.Text = myList.Count + "st"; 
    } 
} 
6

L'approche choisie comme réponse fonctionne très bien ... mais je ne pas spécifiquement comme devoir spécifier le DataContext programme tout en mettant tout le reste en XAML, je ne me sens pas comme il est « bon » (peut-être c'est juste moi). Donc, pour la personne suivante, ou quelqu'un d'autre qui pense comme moi et trouve cela hors d'un moteur de recherche (comme je l'ai fait), voici la façon de le faire en XAML:

C#

public sealed partial class MainPage : Page 
{ 
    public ObservableCollection<string> Messages { get; set; } 

    public MainPage() 
    { 
     this.Messages = new ObservableCollection<string>(); 
     this.InitializeComponent(); 
    } 
} 

XAML

<Window 
    .... 
    DataContext="{Binding RelativeSource={RelativeSource Self}}" 
    ...> 

    <ListView ItemsSource="{Binding Messages}" ... /> 

</Window> 

Pour être honnête, je pense que {Binding RelativeSource={RelativeSource Self}} devrait être la valeur par défaut tout élément de niveau supérieur (Page, Window, etc ...) DataConext parce que c'est simplement comme beaucoup de gens s'attendent à ce que cela fonctionne, je sais que c'est comme ça que je suppose que cela fonctionnerait. Honnêtement, je me sens comme {Binding RelativeSource={RelativeSource Self}} est un peu verbeux et presque long pour une syntaxe plus courte.

Questions connexes