2010-06-03 12 views
5

Jestem wiązania PageMediaSize kolekcję o PrintQueue do ItemSource z ComboBox WPF (Działa to dobrze). Następnie wiążę SelectedItem z ComboBox z . Chociaż ustawi ona wybraną wartość na odpowiednią wartość, nie ustawia początkowo wybranej wartości ComboBox na wartość początkową DefaultPrintTicket.PageMediaSize Wynika to z faktu, że odwołanie DefaultPrintTicket.PageMediaSize nie pasuje do żadnego odwołania w kolekcji. Jednak nie chcę, aby porównywał obiekty przez odniesienie, ale zamiast wartości, ale PageMediaSize nie zastępuje równych (i nie mam nad nim kontroli). To, co naprawdę chciałbym zrobić, to skonfigurować IComparable do użycia, ale nie widzę żadnego sposobu, aby to zrobić. Próbowałem użyć Converter, ale potrzebowałbym więcej niż wartość i nie mogłem wymyślić, jak przekazać kolekcję do ConverterProperty. Wszelkie pomysły dotyczące rozwiązania tego problemu.wiązanie z ComboBox selectedItem gdy odniesienie nie ItemsSource

Oto mój 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"/> 

I kod dla konwertera, który dostaje kolekcji 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(); 
    } 
} 

Edycja

Próbowałem ustawienie DefaultPrintTicket.PageMediaSize do odpowiedniego odniesienia w kolekcja przed InitializeComponent, ale to nie przeszkadzało k. To definately ustawienie wartości, gdy wybiorę coś z ComboBox, ale nie wydaje się, aby przejść w drugą stronę.

Odpowiedz

1

Czy byłoby możliwe utworzenie klasy opakowania dla PageMediaSize i zastąpienie metody Equals(object) w tej klasie opakowania? Następnie można dodać instancję tej klasy opakowania do kolekcji, aby nie były już porównywane przez odniesienie. Oczywiście potrzebny będzie kod do pakowania i rozpakowywania instancji PageMediaSize, ale jest to najlepszy sposób, jaki mogę sobie wyobrazić.

1

Oprócz odpowiedzi juharra, można użyć konwertera do owinięcia i rozwinięcia obiektu.

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

Następnie zadeklarować swoją konwerter

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

w XAML, należy użyć konwertera zarówno ItemSource i wybranej pozycji.

<ComboBox                
    ItemsSource="{Binding MySource, Converter={StaticResource toTypeEqualityWrapper}}" 
    SelectedItem="{Binding MySelectedItem, Converter={StaticResource toTypeEqualityWrapper}}"                
    DisplayMemberPath="Value.DisplayName" /> 
Powiązane problemy