2011-07-31 4 views
1

ComboBoxに問題があります。コンボボックスを開くと、項目が表示されます。アイテムを選択してコンボボックスが閉じているとき、コンボボックスはName, Vornameの代わりにModel.Personと表示されます。DataTemplateを使用すると、ComboBoxの選択項目が正しく表示されません。

  1. どうすれば解決できますか?
  2. 自動候補を実現するにはどうすればよいですか?

私は、DataTamplateを持つComboBoxを持っています。

<ComboBox ItemTemplate="{StaticResource PersonenComboboxTemplate}" 
x:Name="Person1CheckboxName" Text="Choose Person" IsEditable="True" 
ItemsSource="{Binding Path=Personenliste}" 
SelectionChanged="Person1CheckboxName_SelectionChanged" /> 

<DataTemplate x:Key="PersonenComboboxTemplate"> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="{Binding Path=Name}"/> 
     <TextBlock Text=", "/> 
     <TextBlock Text="{Binding Path=Vorname}"/> 
    </StackPanel> 
</DataTemplate> 

私はMVVMパターンを使用します。データバインディングはViewModelに実装されています。

public ObservableCollection<Person> Personenliste 
    { 
     get 
     { 
      ObservableCollection<Person> persColl = 
               new ObservableCollection<Person>(); 
      List<Person> personen = 
          databaseConnection.getAllPersonsRAW().ToList<Person>(); 
      // sort by Vorname and Nachname 
      personen.Sort(new PersonComparer()); 
      foreach (Person p in personen) 
      { 
       persColl.Add(p); 
      } 
      return persColl; 
     } 
    } 

Personは、与えられた名前(Vorname)と姓(Name)を有しています。 Name + " " + Vornameを返すために、Personクラス(または部分クラス)に

[EdmEntityTypeAttribute(NamespaceName="dataModel", Name="Person")] 
[Serializable()] 
[DataContractAttribute(IsReference=true)] 
public partial class Person : EntityObject 
{ 
    #region Factory-Methode 

    /// <summary> 
    /// Erstellt ein neues Person-Objekt. 
    /// </summary> 
    /// <param name="personID">Anfangswert der Eigenschaft PersonID.</param> 
    public static Person CreatePerson(global::System.Int64 personID) 
    { 
     Person person = new Person(); 
     person.PersonID = personID; 
     return person; 
    } 

    #endregion 
    ... 
    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] 
    [DataMemberAttribute()] 
    public global::System.String Name 
    { 
     get 
     { 
      return _Name; 
     } 
     set 
     { 
      OnNameChanging(value); 
      ReportPropertyChanging("Name"); 
      _Name = StructuralObject.SetValidValue(value, true); 
      ReportPropertyChanged("Name"); 
      OnNameChanged(); 
     } 
    } 
    ... 
} 
+0

:コメントで指摘した、あなたは、この第2のアプローチを使用することができますか? – Zmaster

+0

ADO.NETエンティティデータモデル – Jean

答えて

0

オーバーライドToStringメソッド()(ADO.NETエンティティデータモデルによって生成された):

public partial class Person 
{ 
    public override ToString() 
    { 
     return string.Format("{0} {1}", Name, Vorname); 
    } 
} 

編集:

ToStringメソッドので、 ()は通知の変更に反応するものではなく、HB Personクラスが宣言されているどのように

// In PersonPartial.cs 
public partial class Person 
{ 
    public string DisplayText 
    { 
     get { return string.Format("{0} {1}", Name, Vorname); } 
    } 

    partial void OnNameChanged() 
    { 
     OnPropertyChanged("DisplayText"); 
    } 

    partial void OnVornameChanged() 
    { 
     OnPropertyChanged("DisplayText"); 
    } 
} 
<ComboBox ... DisplayMemberPath="DisplayText" />  
+0

によって生成された素晴らしい! :-)ととても簡単! – Jean

+0

'IsTextSearchEnabled =" True "は2番目の問題を解決します。 :-) – Jean

+1

これは他の場所にある問題を解決する悪いハックのようです... –

関連する問題