2011-10-10 4 views
3

이 질문은 내 마지막 질문과 비슷하게 들릴 수 있지만 다른 조언에서 취하는 다른 접근 방법입니다. 다른 경로로 나가 listview에서 whats를 몇 개의 텍스트 상자에 바인딩하려고합니다. 나는 WPF에 매우 익숙하다. 그리고 내가 제대로하고 있는지 확실하지 않다. MVVP 방식이라고 생각합니다. 지금은 프로그램이별로 효과가 없습니다. 목록보기에는 항목이 하나 있지만 비어 있습니다 (이름, 나이, 학년 없음). 내가 목록보기에서 선택하려고 할 때 강조 표시하는 항목 b/c를 볼 수 있습니다. 어떤 도움이라도 대단히 감사합니다.ObservableCollection 및 WPF 바인딩 사용

문자열 이름, int 나이, int 등급을 만드는 클래스가 있으며 getter 및 setter 메서드가 있습니다. ObservableCollection에

 public class Camper 
{ 
public Camper[] requests; 
public int[] relationValues; 
public String name; 
private String school; 
public int age; 
public int grade; 
private Boolean isGrouped = false; 
private string group; 


     public Camper(int a, int g, String n) 
{ 
    requests = new Camper[4]; 
    relationValues = new int[4]; 
    name = n; 
    this.age = a; 
    this.grade = g; 
} 

public Camper(String n) 
{ 
    this.requests = new Camper[4]; 
    this.relationValues = new int[4]; 
    this.name = n; 
} 

public Camper() 
{ 

} 

// Getter Methods 
public string getName() 
{ 
    return name.ToString(); 
} 
public string getSchool() 
{ 
    return this.school; 
} 
public int getAge() 
{ 
    return this.age; 
} 
public int getGrade() 
{ 
    return this.grade; 
} 
public int getRelationValue(int i) 
{ 
    if (i < relationValues.Length) 
    { 
     return relationValues[i]; 
    } 
    else 
    { 
     return 0; 
    } 

} 

class BindingCamper 
{ 
    public ObservableCollection<Camper> Campers { get; private set; } 

    public BindingCamper() 
    { 
     Campers = new ObservableCollection<Camper>(); 

    } 

또 다른 클래스 (페이지)를 만드는 :

public partial class CampersPage : Page 
{ 
    MainWindow _parentForm; 

    public ObservableCollection<Camper> Campers { get; private set; } 

    public CampersPage(MainWindow parent) 
    { 
     _parentForm = parent; 
     InitializeComponent(); 

     // Campers = new ObservableCollection<Camper>(); 
     var bindMe = new BindingCamper(); 
     Camper CampMe = new Camper(3, 4, "Tony Lagarrigue"); 
     // CampMe.getName(); 
     bindMe.Campers.Add(CampMe); 
     DataContext = bindMe; 

XAML에 클래스의 이름은 야영 자 (연령, 학년, 이름)

클래스 BindingCamper라고 모든 것을 묶어 라. :

 <ListView HorizontalAlignment="Left" Margin="10,10,0,40" x:Name ="listViewCampers" Width="200" SelectionChanged="listViewCampers_SelectionChanged" ItemsSource="{Binding Campers}" DisplayMemberPath="name" IsSynchronizedWithCurrentItem="{x:Null}"> 

      <ListView.View> 
       <GridView> 



        <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="100" /> 
        <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" Width="40" /> 
        <GridViewColumn Header="Grade" DisplayMemberBinding="{Binding Grade}" Width="40" /> 

       </GridView> 
      </ListView.View> 
     </ListView> 
     <Grid Height="Auto" HorizontalAlignment="Stretch" Margin="209,12,0,0" Name="infoGrid" VerticalAlignment="Stretch"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="134*" /> 
       <RowDefinition Height="154*" /> 
      </Grid.RowDefinitions> 
      <Label Content="Name" Height="28" HorizontalAlignment="Left" Margin="23,24,0,0" Name="lblName" VerticalAlignment="Top" /> 
     <TextBox Text="{Binding name, ElementName=listViewCampers}" Height="23" HorizontalAlignment="Left" Margin="23,46,0,0" Name="txtName" VerticalAlignment="Top" Width="120" AcceptsReturn="True" /> 
      <TextBox Height="23" HorizontalAlignment="Left" Margin="23,103,0,0" Name="txtAge" VerticalAlignment="Top" Width="120" /> 
+0

'Camper' 클래스를 표시하십시오. – SLaks

+0

Ok 편집했습니다. :) – TMan

+0

데이터 바인딩을 처음 사용하는 경우 [개요] (http://msdn.microsoft.com/en-us/library/ms752347.aspx)를 읽으십시오. –

답변

4

바인딩 할 뷰 모델에서 공용 속성을 만들어야합니다.

닷넷에는 getSomething() 개의 메소드를 만들어서는 안됩니다. 당신의 ListView 선언이 코드에 대한

0

: 당신은 필드 이름 대신 속성을 사용하는

DisplayMemberPath="name" 

. 나는 데이터 바인딩이 필드에 대해 작동한다고 생각하지 않는다. 비록 그것이 공개적이라 할지라도 (솔직히 말해서 나는 이것이 왜 그런지 전혀 이해하지 못했다).

다른 몇 곳에서이 작업을 수행하는 것처럼 보입니다. 속성에 바인딩되어 있는지 확인하고 이름이 올바른지 확인하십시오 (대소 문자 구분).

: SLaks가 지적했듯이 (지적 할 때까지이 사실을 알지 못했지만) 속성을 사용하고 있습니다. getter를 사용하여 실제 .Net 속성이되어야한다고 생각합니다. 예 :

public string Name 
{ 
    get { return _name; } 
} 
관련 문제