2010-02-16 13 views
2

제네릭 목록은 미세 구조체의 목록을 작동했다WPF 데이터 바인딩 <>

대신 구조체의 클래스를 사용하는 경우 SLOVED

해결이 해결

public class Person 
    { 
     public string Name { get; set;} 
     public string ID { get; set;} 
    } 
instead of 


public struct Person 
{ 
    public string Name; 
    public string ID; 
} 

나는 뭔가 잘못하고 있습니다. 당신은 그것이 어떻게되는지 압니다.

ItemsSource, DataContext, DisplayMemberPath 및 SelectedValuePath를 가지고 놀아 보았습니다. 그리고 Person 개체에서 호출되는 ToString 메서드 목록의 빈 목록을 얻습니다.

정말 도움이 될만한 답변은 누군가가이 예에서 효과가있는 답변을 게시하는 것입니다.

제네릭을 데이터 바인딩하는 데 일반적으로 어려움이 있으므로 문제를 단순화했습니다.

저는 개인의 간단한 일반 목록을 만들고이를 콤보에 바인딩하려고합니다. (또한 ListView를 사용해보십시오).

I 중 하나를 공백의 목록 또는 = 코드에서 네임 스페이스

 <Window x:Class="BindingGenerics.MainWindow" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       Title="MainWindow" Height="300" Width="300"> 
      <Grid> 

       <ComboBox Name="ComboBox1" 
          ItemsSource="{Binding}" 
          Height="50" 
          DisplayMemberPath="Name" 
          SelectedValuePath="ID" 
          FontSize="14" 
          VerticalAlignment="Top"> 
       </ComboBox> 

      </Grid> 
     </Window> 



using System.Windows; 
using System.ComponentModel; 

namespace BindingGenerics 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      Person p = new Person(); 
      // I have tried List and BindingList 
      //List<Person> list = new List<Person>(); 
      BindingList<Person> list = new BindingList<Person>(); 

      p.Name = "aaaa"; 
      p.ID = "1111"; 
      list.Add(p); 

      p = new Person(); 
      p.Name = "bbbb"; 
      p.ID = "2222"; 
      list.Add(p); 

      p = new Person(); 
      p.Name = "cccc"; 
      p.ID = "3333"; 
      list.Add(p); 

      p = new Person(); 
      p.Name = "dddd"; 
      p.ID = "4444"; 
      list.Add(p); 

      ComboBox1.DataContext = list; 
     } 
    } 

    public struct Person 
    { 
     public string Name; 
     public string ID; 
    } 
} 
+0

나는 샘플을 시험해 보았고 그것은 저에게 효과적입니다. 단, dddd는 여러 번 표시됩니다. –

답변

5

, Person.Name이 필드가보다는이다 재산. WPF 데이터 바인딩은 필드가 아닌 속성 만 고려하므로 Person.Name을 속성으로 변경해야합니다.

변경하여 사람의 선언 :

public class Person 
{ 
    public string Name { get; set; } 
    public string ID { get; set; } 
} 

(생산 코드의 경우, 당신은 아마 List<Person>보다는 ObservableCollection<Person>를 사용하거나 불변 사람을하거나에서 INotifyPropertyChanged를 구현하도록 할 것입니다 -하지만 사람들은 때로 믿을 수 귀하의 즉각적인 문제의 근원이 아닙니다.)

0

같이 두 번 ItemsSource를 설정하고, XAML에서 처음으로가 (호출 XXXX 'xxxx.Person'의 목록을 InitializeComponent)를 ComboBox1의 DataContext에 추가합니다.이 데이터는 게시 한 항목으로 확인할 수 없지만 원하는 내용이 아닐 수 있습니다. 그런 다음 코드에서 목록 객체 (여기에 오타가 있음)로 다시 설정합니다. 이 코드에서는 Person 4 인스턴스의 동일한 인스턴스를 추가하고 이름과 ID를 계속 변경합니다. 나는이 문제들과 당신이 ObservableCollection 대신에 List를 사용한다는 사실이 응용 프로그램에서 문제를 일으키는 것으로 의심합니다.

실제 코드를 게시 할 수있는 범위를 좁히면 도움이 될 것입니다. 여기에 넣은 코드는 컴파일 할 수 없기 때문에 문제가 발생합니다.

+0

여기에 전체 코드를 입력했습니다 – Adam

+0

수정 된 질문을 참조하십시오 .. 감사의 마음을 얻은 모든 도움. – Adam

0

음 ... 실제 코드가 구문을 수정했다고 가정합니다. 붙여 넣은 코드가 컴파일되지 않기 때문입니다.

이 코드를 새 WPF 앱에 넣고 각 Person 객체를 새로 작성한 후 내 콤보 상자에 잘 채 웁니다. 모집단 코드를 Loaded 이벤트로 옮기면 양식이 제대로 구성되었는지 확인할 수 있습니다. 여기에 (몇 가지 구문 단축키) 수정 된 XAML과 코드 숨김는 다음과 같습니다

XAML :

<Grid> 
    <ComboBox Name="ComboBox1" Height="70" 
     DisplayMemberPath="Name"  
     SelectedValuePath="ID" /> 
</Grid> 

코드 숨김이 :

코드 샘플에서
public Window1() 
    { 
     InitializeComponent(); 
     this.Loaded += new RoutedEventHandler(Window1_Loaded); 
    } 

    void Window1_Loaded(object sender, RoutedEventArgs e) 
    { 
     var list = new List<Person>(); 
     Person p = new Person(){Name = "aaaa",ID = "1111"}; 
     list.Add(p); 
     p = new Person(){Name = "bbbb", ID="2222"}; 
     list.Add(p); 
     p = new Person(){Name = "cccc", ID="3333"}; 
     list.Add(p); 
     p = new Person(){Name = "dddd", ID="4444"}; 
     list.Add(p); 
     ComboBox1.ItemsSource = list; 
    } 
+0

예 .. 내 부분에있는 오류 .. 여기에 코드를 붙여 넣는 법을 배우는 동안 .. 여전히 항목을 나열하는 대신 Person의 ToString()을 호출하십시오. – Adam

+0

위의 itowlson의 조언에 따라 구조체를 클래스 및 속성에 대한 필드? 케이스에 클래스가있을 필요는 없지만 양방향 바인딩이 필요한 경우 클래스를 사용해야하므로 클래스를 항상 사용하는 것이 좋습니다. –