2010-02-04 3 views
5

Dies treibt mich NUTS !!!So verwenden Sie MultiBinding in einer WPF ComboBox

Ich habe eine ComboBox verwendet, um eine Abfrage nach Mitarbeiter zu filtern, die gut funktioniert, aber nur den Vornamen der Mitarbeiter anzeigt. Ich möchte ein MultiValueConverter verwenden, um den Mitarbeitern vollständigen Namen angezeigt werden (Dies wäre weniger dringlich, wenn wir nicht 2 Mikes hatte und 2 Daves)

Unten ist mein Arbeitscode und die IMultiValueConverter Klasse (mit unnötigen Formatierung der Kürze halber getrimmt). Ich habe alles versucht, was mir einfällt, um den MultiConverter zum Laufen zu bringen, aber ich hatte kein Glück.

// This collection is used to populate the Employee Filter ComboBox 
private ObservableCollection<Employee> employeesFilter; 
public ObservableCollection<Employee> EmployeesFilter 
{ 
    get { 
      return employeesFilter; 
     } 
    set { 
     if (employeesFilter != value) 
     { 
      employeesFilter = value; 
      OnPropertyChanged("EmployeesFilter"); 
     } 
    } 
} 

// This property is TwoWay bound to the EmployeeFilters SelectedValue 
private Employee employeeToShow; 
public Employee EmployeeToShow 
{ 
    get { 
      return employeeToShow; 
     } 
    set { 
     if (employeeToShow != value) 
     { 
      employeeToShow = value; 
      OnPropertyChanged("EmployeeToShow"); 
      QueryIssues(); // Requery with new employee filter 
     } 
    } 
} 

The IMultiValueConverter:

<ComboBox ItemsSource="{Binding Path=EmployeesFilter}" 
         DisplayMemberPath="EmpFirstName" 
         SelectedValue="{Binding Path=EmployeeToShow, Mode=TwoWay}"/> 

Die Ansichtsmodell Eigenschaften ist es gebunden

class StringsToFullNameMultiConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, 
          Type targetType, 
          object parameter, 
          System.Globalization.CultureInfo culture) 
    { 
     // I added this because I kept getting DependecyProperty.UnsetValue 
     // Passed in as the program initializes 
     if (values[0] as string != null) 
     { 
      string firstName = (string)values[0]; 
      string lastName = (string)values[1]; 
      string fullName = firstName + " " + lastName; 
      return fullName; 
     } 
     return null; 
    } 

    public object[] ConvertBack(object value, 
           Type[] targetTypes, 
           object parameter, 
           System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
} 

Ich habe versucht, im Grunde eine Menge verschiedener Dinge, aber die folgenden in der ComboBox

bin mit
<ComboBox.SelectedValue> 
    <MultiBinding Converter="{StaticResource StringsToFullNameMultiConverter}" 
        Mode="OneWay" > 
      <Binding Path="EmpFirstName" /> 
      <Binding Path="EmpLastName"/> 
    </MultiBinding> 
</ComboBox.SelectedValue> 

Der Konverter wird jetzt aufgerufen, wenn das Programm mit den auf DependencyProperty.UnsetValue eingestellten Werten initialisiert wird. danach wird es nie wieder aufgerufen, auch wenn Sie einen Namen aus der Box auswählen. Die Namen werden weiterhin als Vorname angezeigt.

Danke für jede Hilfe oder Hinweise auf gute Tutorials/Beispiele, die Sie zur Verfügung stellen können. Alle, die ich im Internet finde, sind für Textboxen und ich kann sie den ganzen Tag gut gebrauchen.

Antwort

19

Sie sind nah dran! Was Sie jedoch tun möchten, ist ComboBox.ItemTemplate, nicht SelectedValue. Bereite dich auf eine XAML-Hölle vor.

Auch, wenn ich mich richtig erinnere, müssen Sie nicht Ihren eigenen Konverter erstellen, wenn Sie nur Zeichenfolgen formatieren. Ich glaube, Sie können gehen Sie wie folgt (bitte jemand korrigiert mich wenn ich falsch liege.)

<!-- "Last, First" --> 
<MultiBinding StringFormat="{}{1}, {0}"> 
    <Binding Path="EmpFirstName" /> 
    <Binding Path="EmpLastName" /> 
</MultiBinding> 
+0

Seltsamerweise funktioniert das aber die Xaml ist mit einem Fehler highlited, der Fehler lautet "Eigenschaft 'Text' unterstützt keine Werte vom Typ 'MultiBinding'." Ich bin mir sicher, dass es eine einfache Lösung sein wird, aber ich verlasse es bis zum Morgen, seit mein wirkliches Problem gelöst ist! Vielen Dank für die Hilfe, ich HATE ins Bett mit einem ungelösten Geheimnis, um mich wach zu halten –

+0

Übrigens, der Code, den Sie für die Formatierung ohne Konverter haben, funktioniert perfekt, wie es ist! –

+0

Das ist ein seltsamer Fehler. Hört sich an, als wäre es nur ein harmloser Cider-Fehler. – Josh

0

Sie können eine Datenvorlage der Verwendung für die Einzelteile besser, so dass Sie die vollständige Kontrolle darüber, wie jeder Person angezeigt wird in der Dropdown-Liste.

Der Typ konvertieren ist OK, vorausgesetzt, Sie müssen die Formatierung der verschiedenen Felder nicht steuern.

0

landete ich von addig eine Readonly-Eigenschaft meiner Klasse und verwenden DisplayMemberPath in der Combobox

public class MyEmployee 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string DisplayName { 
    get { return FirstName + " " + LastName; } 
     } 
} 

könnte so etwas wie diese Arbeit für Ihre Situation ...? BR, Daniel

+0

Ehrlich gesagt habe ich keine Ahnung, die ursprüngliche Frage ist von 2010 und ist lange aus meinem Radar :) –

+0

Ich sah es ... Nur dazu gedacht, meine 2Cent zu posten, falls jemand sie benutzen könnte :) – dba