2010-02-04 12 views
5

¡Esto me está impulsando NUTS!Cómo usar MultiBinding en un WPF ComboBox

Tengo un ComboBox utilizado para filtrar una consulta por empleado que funciona bien pero solo muestra el nombre del empleado. Quiero usar un MultiValueConverter para mostrar la empleados nombre completo (Este sería menos urgente si no teníamos 2 micrófonos y 2 Daves)

A continuación se muestra el código de trabajo y de la Clase IMultiValueConverter (con el formato innecesaria recortado a cabo por razones de brevedad) He intentado todo lo que se me ocurre para hacer funcionar el MultiConverter, pero no he tenido suerte.

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

Las Propiedades ViewModel que está obligado a:

// 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 
     } 
    } 
} 

El IMultiValueConverter:

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; 
    } 
} 

He intentado un montón de cosas diferentes, pero básicamente estoy usando lo siguiente en el cuadro combinado

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

Tal como está ahora, se llama al convertidor cuando el programa se inicializa con los valores establecidos en DependencyProperty.UnsetValue. después de eso nunca se llama nuevamente, incluso cuando selecciona un nombre del cuadro. Los nombres todavía se muestran como un primer nombre.

Gracias por cualquier ayuda o consejos para buenos tutoriales/muestras que puede proporcionar. Todos los que sigo encontrando en la web son para cuadros de texto y puedo usarlos bien todo el día.

Respuesta

19

¡Estás cerca! Lo que quiere hacer es ComboBox.ItemTemplate, no SelectedValue. Prepárate para un infierno XAML.

<ComboBox.ItemTemplate> 
    <DataTemplate> 
     <TextBlock> 
      <TextBlock.Text> 
       <MultiBinding Converter="{StaticResource StringsToFillNameMultiConverter}"> 
        <Binding Path="EmpFirstName" /> 
        <Binding Path="EmpLastName" /> 
       </MultiBinding> 
      </TextBlock.Text> 
     </TextBlock> 
    </DataTemplate> 
</ComboBox.ItemTemplate> 

Además, si no recuerdo mal, no necesita crear su propio convertidor si solo está formateando cadenas. Creo que se puede hacer lo siguiente (por favor, que alguien me corrija si estoy equivocado.)

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

Curiosamente, esto funciona pero el xaml aparece resaltado con un error, el error dice "Propiedad 'Texto' no admite valores de tipo 'Enlace múltiple'." ¡Estoy seguro de que será una solución fácil, pero lo dejo hasta la mañana, ya que mi verdadero problema está resuelto! Muchas gracias por la ayuda, ODIO irme a la cama con un misterio sin resolver para mantenerme despierto –

+0

Por cierto, ¡el código que tiene para formatear sin un convertidor funciona perfectamente tal como es! –

+0

Eso es un error extraño. Aunque suena como si fuera un insecto inofensivo para la sidra. – Josh

0

Usted puede ser mejor de utilizar una plantilla de datos para los artículos, por lo que tiene un control completo sobre cómo se muestra cada persona en la lista desplegable.

El tipo de conversión está bien, siempre que no tenga que controlar el formato de los diferentes campos.

0

que terminaron por addig una propiedad de solo lectura a mi clase y utilizar DisplayMemberPath en el cuadro combinado

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

Podría algo así como este trabajo para su situación ...? BR, Daniel

+0

Honestamente, no tengo ni idea, la pregunta original es de 2010 y está lejos de mi radar :) –

+0

Lo vi ... Solo quería publicar mi 2Cent en caso de que alguien pudiera usarlo :) – dba