2009-02-02 3 views
8

XAML의 내 ComboBox을 코드 뒤에있는 List 모음의 사용자 지정 개체 모음에 바인딩하려고합니다.WPF : ComboBox가 데이터 대신 "(네임 스페이스). (클래스 이름)"을 표시합니다.

현재 ComboBox은 각각 dpwpf.Contact 인 내 {namespace}.{classname}의 항목을 나열합니다.

목록에 표시하려면 XAML에 무엇을 입력해야합니까? 예 : 성 + 이름?

나는 그것이 {Binding Path=... Value=...}와 같은 것이지만 나는 그것을 얻을 수 없다는 것을 알고있다.

XAML :

<Window x:Class="dpwpf.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <StackPanel> 
      <TextBlock Text="Select the contact:"/> 
      <ComboBox Name="theContactList"/> 
     </StackPanel> 
    </StackPanel> 
</Window> 

코드 뒤에 :

namespace dpwpf 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      StoreDB db = new StoreDB(); 
      List<Contact> contacts = db.GetContacts() 
      theContactList.ItemsSource = contacts.ToList(); 
     } 
    } 
} 

답변 :

<Window x:Class="dpwpf.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" 
    xmlns:local="clr-namespace:dpwpf"> 

    <Window.Resources> 
     <DataTemplate DataType="{x:Type local:Contact}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding LastName}"/> 
       <TextBlock Text=" "/> 
       <TextBlock Text="{Binding FirstName}"/> 
      </StackPanel> 
     </DataTemplate> 
    </Window.Resources> 

    <StackPanel> 
     <StackPanel Margin="10"> 
      <TextBlock Text="Contact Name:" Foreground="#555"/> 
      <TextBox Name="theName"/> 
     </StackPanel> 
     <StackPanel> 
      <TextBlock Text="Select the contact:"/> 
      <ComboBox Name="theContactList"/> 
     </StackPanel> 
    </StackPanel> 
</Window> 
+0

[WPF는 IsEditable = 개체 가득 참 콤보가 선택한 항목)에게 있으며, toString (표시]의 가능한 복제 (https://stackoverflow.com/questions/1844156/wpf- :

그 예를 참조 iseditable-true-combobox-filled-with-objects-displays-the-to-string-as-the) –

답변

7

당신은 ContactToString 방법을 재정의 할 수 있습니다, 또는 당신은 WPF에서 DataTemplate을 정의 할 수 있습니다.

xmlns:dpwpf="... namespace of dpwpf" 

<Window.Resources> 
    <DataTemplate DataType="{x:Type dpwpf:Contact}"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding LastName}"> 
      <TextBlock Text=" "> 
      <TextBlock Text="{Binding FirstName}"> 
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 

이렇게하면 Contact 객체가 어디 창에 표시되는 방식을 정의 할 수 있습니다. 이 값을 ComboBox으로 제한하려면 ComboBox 리소스에만 DataTemplate을 추가하면됩니다.

TextSearch.TextPath ="Title" 

ToString() 수정 당신이 그것을 필요로하는 모든 미래의 사건에 영향을 미친다 (XAML 코드)

+0

와우, 나는 그 싱크대에 들어가야 할 것입니다. 당신은 StackPanel을 ComboBoxItem 내부에서 사용할 수 있습니다. 그래서 게시 된 응답 코드는 위의 작동하지만 내 ComboBox와 DataTemplate 사이의 연결이 표시되지 않습니다, 나는 DataTemplate에 이름이 있고 ComboBox가 그것을 참조 할 것으로 기대하고 있습니다. –

+0

콤보 상자에 연락처 개체가 표시됩니다. 따라서 WPF는 연락처를 표시하는 DataTemplate에 대한 시각적 트리를 검색하고 해당 템플릿을 사용합니다. 템플릿이 없으면 기본값은 ToString입니다. Contact 객체를 통하는 경우를 제외하고 직접 연결은 없습니다. –

+0

이것은 WPF의 아름다움입니다. 데이터 객체를 표시하는 방법을 정의한 다음 해당 객체가 표시 될 때마다 템플릿을 표시하는 데 사용됩니다. –

2

당신이 DisplayMember이 = "TheValue"

당신이 추가 할 수 있습니다 사용할 필요가 XAML 또는 CLR 또한 XAML을 통하지 않고 제본 바인딩에주의하십시오. 나는 이것이 당신의 분명한 질문과 관련이 있다고 생각합니다. ObjectDataProvider 통해 바인딩을 실시 예를 사용하여 XAML

HTH, 에릭의 DisplayMemeber = "일원이"를 추가 구현 ,

+0

예,이 작업은 가능하지만 텍스트 대신에 콤보 박스 항목을 포맷 할 수 있어야합니다. 성 + ""+ 이름 –

+0

안녕하세요 에드워드, 너무 오래 걸려서 미안 해요. 문제를 해결할 수있는 몇 가지 방법이 있습니다. 1) this.lastname + ","+ this.firstname을 반환하는 FullName 속성을 추가합니다. 표시 장치로 사용하십시오. HH, Eric – user61477

+0

2) IValueConverter를 사용하여 표시된 vaule을 변환하면 XAML에서 정적 리소스로 사용하고 변환기 XML 속성을 추가 할 수 있습니다. – user61477

4

어떤 결합기구 종류에 ToString()를 호출하고있는 것을 바인딩되고있다. 왜냐하면 당신이 ToString()을 오버라이드하지 않는다고 생각하기 때문에, 뭔가 유용한 대신 네임 스페이스 타입을 사용할 수 있습니다.

반역자가 말한 것처럼 DisplayMember를 사용하여 바인딩에서 표시 값에 해당 이름의 속성을 사용하도록 지정하거나 아래의 ToString()을 재정 의하여 사용자 정의 속성을 표시 할 수 있습니다.

public void Contact 
{ 
public string FirstName { get; set; } 
public override string ToString() 
{ 
    return FirstName; 
} 
} 
+1

이것은 좋지만, 다르게 오버라이드하고 싶은 다른 컨트롤을 가지고있을 수도 있습니다. –

6

이 그냥 콤보 태그이 추가 베아 Stollnitz에 의해 What does "{Binding}" mean?보기, 내가 어떻게 당신을하지 않는 것이 좋습니다 그. http://simplesample.site90.com/wpf_combobox.php

+0

'TextSearch.TextPath'와 같은 속성이라는 것을 알았지 만, ToString 및 DisplayMemberPaths를 제안하는 사람들 중에서 올바른 답을 찾기가 쉽지 않습니다 ... 감사합니다! – Gman

관련 문제