2010-06-03 958 views
5

estoy vinculante la colección PageMediaSize de un PrintQueue a la ItemSource de un ComboBox WPF (Esto funciona muy bien). Entonces estoy vinculando el SelectedItem del ComboBox al DefaultPrintTicket.PageMediaSize del PrintQueue. Si bien esto establecerá el valor seleccionado en DefaultPrintTicket.PageMediaSize simplemente no establece el valor inicialmente seleccionado de ComboBox en el valor inicial de DefaultPrintTicket.PageMediaSize Esto se debe a que la referencia DefaultPrintTicket.PageMediaSize no coincide con ninguna de las referencias en la colección. Sin embargo, no quiero que compare los objetos por referencia, sino por valor, pero PageMediaSize no anula Igual (y no tengo control sobre él). Lo que realmente me gustaría hacer es configurar un IComparable para el ComboBox para usar, pero no veo ninguna forma de hacerlo. Intenté usar un Converter, pero necesitaría más que el valor y no pude descifrar cómo pasar la colección al ConverterProperty. Cualquier idea sobre cómo manejar este problema.unión a ComboBox SelectedItem cuando se hace referencia no en ItemsSource

Aquí es mi xaml

<ComboBox x:Name="PaperSizeComboBox" 
      ItemsSource="{Binding ElementName=PrintersComboBox, Path=SelectedItem, 
         Converter={StaticResource printQueueToPageSizesConverter}}" 
      SelectedItem="{Binding ElementName=PrintersComboBox, 
         Path=SelectedItem.DefaultPrintTicket.PageMediaSize}" 
      DisplayMemberPath="PageMediaSizeName" 
      Height="22" 
      Margin="120,76,15,0" 
      VerticalAlignment="Top"/> 

Y el código para el convertidor que recibe la colección PageMediaSize

public class PrintQueueToPageSizesConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
          System.Globalization.CultureInfo culture) 
    { 
     return value == null ? null : 
      ((PrintQueue)value).GetPrintCapabilities().PageMediaSizeCapability; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
          System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Editar

Intenté fijar el DefaultPrintTicket.PageMediaSize a la referencia correspondiente en el colección antes de InitializeComponent, pero eso no funcionó k. Definitivamente establece el valor cuando selecciono algo del ComboBox, pero no parece ir en la dirección opuesta.

Respuesta

1

¿Sería posible crear una clase contenedora para PageMediaSize y anular el método Equals(object) en esta clase contenedora? A continuación, puede agregar una instancia de esta clase contenedora a su colección, para que ya no se comparen por referencia. Por supuesto, necesitará un código para envolver y desenvolver sus instancias PageMediaSize, pero esa es la mejor manera que me puedo imaginar.

1

Además de la respuesta de juharr, podría usar un convertidor para envolver y desenvolver el objeto.

using System; 
using System.Collections; 
using System.Globalization; 
using System.Linq; 
using System.Windows.Data; 

namespace MyNameSpace 
{ 
    public class ToTypeEqualityWrapper : IValueConverter 
    { 
     public class TypeEqualityWrapper 
     { 
      public object Value { get; set; } 

      public TypeEqualityWrapper(object value) 
      { 
       Value = value; 
      } 

      public override bool Equals(object obj) 
      { 
       var otherWrapper = obj as TypeEqualityWrapper; 
       if (otherWrapper == null) 
        return false; 

       var result = Value.GetType().FullName == otherWrapper.Value.GetType().FullName; 
       return result; 
      } 
     } 

     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      var list = value as IList; 
      if (list != null) 
      { 
       return (from object item in list select new TypeEqualityWrapper(item)).Cast<object>().ToList(); 
      } 

      return new TypeEqualityWrapper(value); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      var wrapper = value as TypeEqualityWrapper; 
      if(wrapper != null) 
       return wrapper.Value; 

      return value; 
     } 
    } 
} 

declarará su convertidor

<ns:ToTypeEqualityWrapper x:Key="toTypeEqualityWrapper" />  

En el XAML, utilizar el convertidor en tanto ItemSource y elemento seleccionado.

<ComboBox                
    ItemsSource="{Binding MySource, Converter={StaticResource toTypeEqualityWrapper}}" 
    SelectedItem="{Binding MySelectedItem, Converter={StaticResource toTypeEqualityWrapper}}"                
    DisplayMemberPath="Value.DisplayName" /> 
Cuestiones relacionadas