2010-06-03 28 views
5

ben bir ComboBox ait ItemSource bir PrintQueue arasında PageMediaSize koleksiyonunu bağlayıcı ediyorum değil ComboBox SelectedItem bağlanma WPF (Bu iyi çalışıyor). Daha sonra ComboBox'un SelectedItem numaralarını PrintQueue'un DefaultPrintTicket.PageMediaSize numaralarına bağlarım. Bu, DefaultPrintTicket.PageMediaSize seçili değeri ayarlayacaktır, ancak DefaultPrintTicket.PageMediaSize başlangıç ​​değerine göre ComboBox başlangıç ​​değeri ayarlanmamıştır. Bunun nedeni, DefaultPrintTicket.PageMediaSize başvurusunun koleksiyondaki herhangi bir referansla uyuşmamasıdır. Ancak, nesneleri referans ile karşılaştırmak istemiyorum, ancak değer yerine PageMediaSize, Eşittir'i geçersiz kılmaz (ve üzerinde hiçbir denetimim yoktur). Gerçekten yapmak istediğim,için IComparable'u kullanmaktır, ancak bunu yapmanın bir yolunu görmüyorum. Bir Converter kullanmayı denedim, ancak değerden daha fazlasına ihtiyacım vardı ve koleksiyonun ConverterProperty'a nasıl geçeceğini anlayamadım. Bu sorunu nasıl ele alacağınıza dair herhangi bir fikir.referans ItemsSource

İşte benim 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"/> 

Ve PageMediaSize Koleksiyon

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

Edit ben karşılık gelen referansa DefaultPrintTicket.PageMediaSize ayarlama çalıştı

alır dönüştürücü kod InitializeComponent'dan önce koleksiyon, ama bu kötü değildi k. ComboBox'dan bir şey seçtiğimde kesinlikle değer ayarlıyor, ancak başka yöne gitmiyor gibi görünüyor.

cevap

1

PageMediaSize için bir sarıcı sınıfı oluşturmak ve bu sarıcı sınıfındaki Equals(object) yöntemini geçersiz kılmak mümkün mü? Daha sonra bu sarmalayıcı sınıfının örneğini koleksiyonunuza ekleyebilir, böylece artık referansla karşılaştırılmamış olur. Tabii ki, PageMediaSize örneklerinizi sarmak ve paketlemek için bazı kodlara ihtiyacınız olacak, ama hayal edebileceğim en iyi yol bu.

1

Juharr'ın cevabına ek olarak, nesneyi sarmak ve açmak için dönüştürücü kullanabilirsiniz.

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

Sonra ItemSource ve Seçilmiş Öğe hem dönüştürücüyü kullanmak, sizin dönüştürücü xaml içinde

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

ilan ediyoruz.

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