2012-07-29 4 views
0

저는 WPF에서 초보자입니다. ViewModel에서 중첩 된 listview 바인딩을 시도하고있다.WPF에서 ViewModel의 중첩 목록보기

나는 두 개의 listview 부모와 자식을 가지고있다. 내 부모 listview datatemplate 뭔가를 바인딩 할 자식 목록보기 싶습니다

같은 asp.net 중첩 된 gridview. 어느 누구도이 문제를 해결할 수 있도록 도와 주실 수 있습니까?

데이터 표시와 같은 :

StudentID 이름

S101 아자 드

수학 3

C#을 여기에 3

StudentID, 이름 상위 목록보기의 내용과 주제는 자식 목록보기 내용있는 StudentID에 의해 필터링됩니다.

감사합니다,

아리조나 @ d를

답변

1
<Grid> 
    <ListView ItemsSource="{Binding Students}"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto"/> 
         <RowDefinition Height="2"/> 
         <RowDefinition Height="Auto"/> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto"/> 
         <ColumnDefinition Width="5"/> 
         <ColumnDefinition Width="Auto"/> 
        </Grid.ColumnDefinitions> 
        <TextBlock Text="{Binding Name}" Grid.Column="0"/> 
        <TextBlock Text="{Binding RollNo}" Grid.Column="2"/> 
        <ListView ItemsSource="{Binding SubjectAndMarks}" Grid.Row="2" Grid.ColumnSpan="2" Grid.Column="0" BorderThickness="0"> 
         <ListView.ItemTemplate> 
          <DataTemplate> 
           <Grid> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="Auto"/> 
             <ColumnDefinition Width="5"/> 
             <ColumnDefinition Width="Auto"/> 
            </Grid.ColumnDefinitions> 
            <TextBlock Text="{Binding Subject}" Grid.Column="0"/> 
            <TextBlock Text="{Binding Marks}" Grid.Column="2"/> 
           </Grid> 
          </DataTemplate> 
         </ListView.ItemTemplate> 
        </ListView> 
       </Grid> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
</Grid> 

    public class SubjectAndMarks 
{ 
    public string Subject { get; set; } 
    public double Marks { get; set; } 
} 
public class Student 
{ 
    public string Name { get; set; } 
    public int RollNo { get; set; } 
    public ObservableCollection<SubjectAndMarks> SubjectAndMarks { get; set; } 
} 
public class ViewModel //ViewModel 
{ 
    public ObservableCollection<Student> Students { get; set; } 
    public ViewModel() 
    { 
     Students = new ObservableCollection<Student>(); 
     Students.Add(new Student() 
     { 
      Name = "Harish", 
      RollNo = 1, 
      SubjectAndMarks = new ObservableCollection<SubjectAndMarks>() 
     {new SubjectAndMarks(){Subject="Maths",Marks=100},new SubjectAndMarks(){Subject="Hindi",Marks=100}, 
     new SubjectAndMarks(){Subject="Science",Marks=100}} 
     }); 
     Students.Add(new Student() 
     { 
      Name = "Pankaj", 
      RollNo = 2, 
      SubjectAndMarks = new ObservableCollection<SubjectAndMarks>() 
     {new SubjectAndMarks(){Subject="Maths",Marks=100},new SubjectAndMarks(){Subject="Hindi",Marks=40}, 
     new SubjectAndMarks(){Subject="Science",Marks=30}} 
     }); 
     Students.Add(new Student() 
     { 
      Name = "Deepak", 
      RollNo = 3, 
      SubjectAndMarks = new ObservableCollection<SubjectAndMarks>() 
     {new SubjectAndMarks(){Subject="Maths",Marks=90},new SubjectAndMarks(){Subject="Hindi",Marks=50}, 
     new SubjectAndMarks(){Subject="Science",Marks=60}} 
     }); 
    } 
} 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new ViewModel(); 
    } 

은 그게 도움이되기를 바랍니다.

+0

이것은 원하는대로 보관할 수있는 예입니다. – ethicallogics

+0

답장을 보내 주셔서 감사합니다. 사실, Subject 클래스를 Student 클래스 내에 유지하고 싶지는 않지만, 목록 뷰에 새 행이 만들어 질 때마다이 데이터를 읽고 싶습니다. 이렇게하기 위해 listview 항목 템플리트에서 TextBlock을 하나 가져 왔고 textblock에서 이벤트를 바인드 한 자식 listview를 초기화했습니다. 모든 작업은 코드에서 수행했지만 뷰 모델에서 텍스트 블록 초기화 이벤트를 catch 할 수 없습니다. 그것 또는 모든 viewview 이벤트에서 catch하는 rowcreated 같은 모든 아이디어. – Azad

+0

최악의 구현이 될 것입니다. 모든 데이터를 모두 가져 오지 않는 이유는 무엇입니까? 데이터를 하나씩 가져 오는 이유가 무엇입니까? – ethicallogics

관련 문제