2010-06-14 79 views
2

我正在学习WPF,并希望有一个类似于LinkedList的集合,我可以在其中添加和删除字符串。我想要一个ListView用数据绑定来收听那个集合。我如何将一个简单的列表集合绑定到XAML中的ListView如何在XAML中将List作为ItemSource绑定到ListView?

我的想法(没有工作)是这样的:

<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> 

我所有的代码(更新版,不工作):

<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> 

C#-code:

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"; 
     } 
    } 
} 

回答

4

您只能将数据绑定到公共属性,并且需要设置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

选择作为答案的方法工作得很好...但我并不特别喜欢有以编程方式指定DataContext而在XAML中设置的一切,我不觉得这是“正确的”(也许这只是我)。因此,对于下一人,或其他任何人谁认为和我一样,认为这掀起了搜索引擎(像我一样),这里是做在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> 

说实话,我觉得{Binding RelativeSource={RelativeSource Self}}应该是默认值的任何顶级元素(PageWindow,等...)DataConext,因为这只是很多人期望它的工作方式,我知道这是我认为它会工作的方式。老实说,我觉得{Binding RelativeSource={RelativeSource Self}}有点冗长,而且语法较短。