2013-12-17 3 views
3

작동하지 않는 목록의 인스턴스에 사용자 지정 목록과의 selectedItem에 itemsource 결합하지만, 난 여전히 여기 :(콤보 내가 일하는 내 콤보를 만들기 위해 정말 다른 방법을 시도

붙어 매우 단순화 된 버전입니다 해요 내 응용 프로그램 (단지 실수 죄송합니다, 편집)

<ListView ItemsSource="{Binding People}" SelectedItem="{Binding SelectedPerson}"/> 
<ComboBox ItemsSource="{Binding Grades}" SelectedItem="{Binding SelectedPerson.MyGrade}" 
    DisplayMemberPath="Name"/> 

그리고 뒤에있는 코드 :

public class Person 
{ 
    private string name; 
    public string Name 
    { 
     get { return name; } 
     set 
     { 
      if (name != value) 
      { 
       name = value; 
       NotifyPropertyChanged("Name"); 
      } 
     } 
    } 

    private Grade myGrade; 
    public Grade MyGrade 
    { 
     get { return myGrade; } 
     set 
     { 
      if (myGrade != value) 
      { 
       myGrade = value; 
       NotifyPropertyChanged("MyGrade"); 
      } 
     } 

    } 

    //-- INotifyPropertyChanged implementation 
} 
public class Grade 
{ 
    private string name; 
    public string Name 
    { 
     get { return name; } 
     set 
     { 
      if (name != value) 
      { 
       name = value; 
       NotifyPropertyChanged("Name"); 
      } 
     } 
    } 

    private int prop; 
    public int Prop 
    { 
     get { return prop; } 
     set 
     { 
      if (prop != value) 
      { 
       prop = value; 
       NotifyPropertyChanged("Prop"); 
      } 
     } 

    } 

    //-- INotifyPropertyChanged implementation 
} 
public partial class MainWindow : Window 
{ 
    public ObservableCollection<Person> People { get; set; } 
    public ObservableCollection<Grade> Grades { get; set; } 

    private Person selectedPerson; 
    public Person SelectedPerson 
    { 
     get { return selectedPerson; } 
     set 
     { 
      if (selectedPerson != value) 
      { 
       selectedPerson = value; 
       NotifyPropertyChanged("SelectedPerson"); 
      } 
     } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 

     People = new ObservableCollection<Person>(); 
     Grades = new ObservableCollection<Grade>(); 

     Grades.Add(new Grade() { Name = "Grade 1", Prop = 1 }); 
     Grades.Add(new Grade() { Name = "Grade 2", Prop = 2 }); 

     People.Add(new Person() { Name = "guy 1", MyGrade = Grades[0] }); 
     People.Add(new Person() { Name = "guy 2", MyGrade = Grades[0] }); 
     People.Add(new Person() { Name = "guy 3", MyGrade = Grades[1] }); 
    } 

    //-- INotifyPropertyChanged implementation 
} 

문제는 내가 항목에서를 선택하면 콤보가 여전히 비어 있다는 것입니다 listview. itemsource는 괜찮습니다 (콤보 상자를 클릭하면 "1 학년"과 "2 학년"을 볼 수 있습니다). "Person.GradeGrades 목록에 포함되어 있습니다."라고 말하면서 누락 된 부분이 있습니다.하지만 찾을 수 없습니다. ,

+1

이 (가)'은'ItemsSource'의 항목으로 메모리에 동일한 기준을 SelectedItem'인가? 기본적으로 WPF는 항목을 참조로 비교하므로 문제가 될 수 있습니다. 그것들이 다른 경우,'SelectedValue'를 사용하거나'.Equals()'를 덮어 쓰는 것이 좋습니다. 예를 들어 [here] (http://rachel53461.wordpress.com/2011/08/20/comboboxs-selecteditem-not-displaying/) 참조하십시오. – Rachel

+0

문제는 그런 것에서 비롯된 것 같습니다. 그렇지 않습니다. selecteditem과 itemssource가 같은 참조에서 온다고 생각하십시오. 나는 오늘 밤 그걸 시험 할거야;) – anthoLB29

+0

정말 고마워 !! equals 오버라이드 메소드는 저를 구해줬습니다 :) :) – anthoLB29

답변

5

SelectedItemItemsSource의 항목으로 메모리에 동일한 참조입니다 : 아래

하나가이를 얼마나의 샘플 조각인가?

기본적으로 WPF는 ItemsSource의 항목을 참조로 비교하고 메모리에서 동일한 참조가 아닌 경우 일치하는 항목을 반환하지 않습니다.

  • 바인드 대신 참조 형식의 값 형식에 SelectedValue하고,이 SelectedValuePath

    을 설정 코드에서이 작업을 수행 할 수없는 경우

    는 가장 일반적인 해결 방법 중 하나를 할 수 있습니다

    <ComboBox ItemsSource="{Binding Grades}" 
          SelectedValue="{Binding SelectedPerson.MyGrade.GradeId}" 
          SelectedValuePath="GradeId" 
          DisplayMemberPath="Name"/> 
    
  • .Equals()을 무시하거나 특정 속성이 일치 할 때 두 개체가 동일하게 간주되도록하십시오. 메모리에서 참조가 일치 할 때 동등한 것으로 간주되는 것과는 반대입니다.

    public override bool Equals(object obj) 
    { 
        if (obj == null || !(obj is Grade)) 
         return false; 
    
        return ((Grade)obj).GradeId == this.GradeId); 
    } 
    
2

몇 가지) 먼저이 Grade에 결합하고, 당신의 재산은 MyGrade라고,

당신이 날 도울 수 있기를 바랍니다. 마지막으로 당신을

Grades.Add(new Grade() { Name = "Grade 1", Prop = 1 }); 
Grades.Add(new Grade() { Name = "Grade 2", Prop = 2 }); 

People.Add(new Person() { Name = "guy 1", MyGrade = Grades[0] }); 
People.Add(new Person() { Name = "guy 2", MyGrade = Grades[0] }); 
People.Add(new Person() { Name = "guy 3", MyGrade = Grades[1] }); 

: 두 번째는 Grades 목록에 등급에 대해 서로 다른 객체를 인스턴스화하고 각 사람에게 할당하는 다른 개체를 사용하고, 당신은 당신이 그들을 제대로 같은 것을 매핑 할 경우 동일한 개체를 사용하려면 그것을 UI에 바인딩하려는 경우 Grades 컬렉션을 ObservableCollection으로 만들 수도 있습니다. 또한 귀하의 RaisePropertyChanged이 해당 부동산의 이름을 사용하지 않는다는 것이 다소 이상하게 보입니다.

다른 실수가있을 수 있지만 바로 저에게 즉시 뛰어든 것입니다.

+0

그래,'Grades'를 원해요 ('MainWindow' 'ObservableCollection'이됩니다). 또한, 그것을 위해'INotifyPropertyChanged' 이벤트를 발생시킬 필요가 있습니다. 'Grades' 속성 *이 설정되어 있지만 바인딩에 새 컬렉션을 찾기 위해 알림이 전송되지 않습니다. – Erik

+0

실수를 가져 주셔서 감사합니다 :) 너무 빨리 내 "단순화 된 응용 프로그램"을 썼습니다 ... 불행히도, 문제가 지속됩니다. 귀하의 답변에 대한 수정 – anthoLB29

0

처음에는 바인딩 오류가 없는지 확인하십시오. Visual Studio에서 출력 창을 열고 바인딩 표현식과 관련된 오류 메시지가 없는지 확인하여이를 확인할 수 있습니다.

오류 메시지는 다음과 같은 텍스트가 포함되어 있기 때문에 쉽게이 자리 할 수 ​​있어야한다 : 당신이 시도하고 직접 콤보 선택한 항목을 결합하지 않는 이유 다른 방법으로 BindingExpression 경로 오류

을 ListView에서 선택한 항목.

<ListView 
    x:Name="listView" 
    ItemsSource="{Binding People}" 
    DisplayMemberPath="Name" /> 
<ComboBox 
    ItemsSource="{Binding Grades}" 
    SelectedItem="{Binding SelectedItem.MyGrade, ElementName=listView}" 
    DisplayMemberPath="Name"/> 
+0

Thx로 게시물을 편집하지만 바인딩 오류가 없습니다. 목록보기 항목을 직접 바인딩 할 필요가 없습니다. – anthoLB29

+0

이전 답장은 속성을 모두 우회하여 목록보기에서 항목을 선택할 때 콤보 상자가 업데이트되는지 확인하는 것이 었습니다. 그렇다면 뷰 모델에 잘못된 것이있을 것입니다. 제공된 코드를 사용하여 시나리오를 복제 할 수있었습니다. 클래스 정의에서 INotifyPropertyChanged 인터페이스를 생략했습니다. 당신이 간결함을 위해 이들을 생략했는지는 모르겠지만, 이것이 제거되면 정확한 문제를 일으킬 것입니다. '공용 클래스 담당자 : 아래로 클래스 정의를 변경 –

+0

INotifyPropertyChanged' '공용 클래스 학년 : INotifyPropertyChanged' 을'공공 부분 클래스 MainWindow를 : 윈도우, INotifyPropertyChanged' –