2010-06-03 18 views
5

sto vincolante la raccolta PageMediaSize di un PrintQueue alla ItemSource di un ComboBox (Questo funziona bene). Quindi collego lo SelectedItem dello ComboBox allo DefaultPrintTicket.PageMediaSize dello PrintQueue. Mentre questo imposterà il valore selezionato su DefaultPrintTicket.PageMediaSize bene, non imposta il valore inizialmente selezionato di ComboBox sul valore iniziale di DefaultPrintTicket.PageMediaSize Questo perché il riferimento DefaultPrintTicket.PageMediaSize non corrisponde a nessuno dei riferimenti nella raccolta. Tuttavia, non voglio che confronti gli oggetti per riferimento, ma invece per valore, ma PageMediaSize non esegue l'override di Equals (e non ho alcun controllo su di esso). Quello che mi piacerebbe davvero fare è impostare un IComparable per il ComboBox da usare, ma non vedo alcun modo per farlo. Ho provato a utilizzare uno Converter, ma avrei bisogno di più del valore e non sono riuscito a capire come passare la raccolta allo ConverterProperty. Qualche idea su come gestire questo problema.WPF vincolante per ComboBox SelectedItem quando riferimento non in ItemsSource

Ecco la mia 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"/> 

E il codice per il convertitore che ottiene la raccolta 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(); 
    } 
} 

Modifica

ho provato a fissare il DefaultPrintTicket.PageMediaSize al corrispondente riferimento nel raccolta prima dello InitializeComponent, ma non era un problema K. Definisce senz'altro il valore quando seleziono qualcosa dallo ComboBox, ma non sembra andare nella direzione opposta.

risposta

1

Sarebbe possibile creare una classe wrapper per PageMediaSize e sovrascrivere il metodo Equals(object) in questa classe wrapper? È quindi possibile aggiungere un'istanza di questa classe wrapper alla raccolta, in modo che non vengano più confrontati per riferimento. Naturalmente, avrai bisogno di un codice per avvolgere e scartare le tue istanze , ma questo è il modo migliore che io possa immaginare.

1

Oltre alla risposta di juharr, è possibile utilizzare un convertitore per avvolgere e scartare l'oggetto.

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

quindi dichiarare il vostro convertitore

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

In XAML, utilizzare il convertitore su entrambi ItemSource e voce selezionata.

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