2010-06-14 3 views
2

저는 WPF를 배우고 있으며, 문자열을 추가하고 제거 할 수있는 LinkedList와 비슷한 컬렉션을 갖고 싶습니다. 그리고 데이터 바인딩을 사용하여 해당 컬렉션을 청취하는 ListView을 갖고 싶습니다. XAML의 간단한 목록 컬렉션을 ListView에 바인딩하려면 어떻게해야합니까?List를 ItemSource로 ListView에 XAML로 바인딩하려면 어떻게해야합니까?

<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

답변으로 선택한 방법은 잘 작동 ...하지만 난 XAML에서 다른 모든 설정하면서 "적절한"처럼, 내가 생각하지 않습니다 프로그래밍 DataContext를 지정하는 것과 같습니다 특별히하지 않습니다 이것은 단지 나다). 그래서 다음 사람, 또는 나처럼 생각하고 (내가했던 것처럼) 검색 엔진이를 발견 다른 사람을 위해, 여기 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}} 기본값 있어야한다고 생각 정직하게하려면 어떤 최상위 요소의 (Page, Window 등) DataConext 단순히 많은 사람들이 어떻게 작동하리라고 예상했기 때문에 그것이 작동한다고 가정하는 방법입니다. 솔직히 말해서, 나는 {Binding RelativeSource={RelativeSource Self}}이 좀 더 길고 짧은 문법에 대해 길다는 느낌이 든다.

관련 문제