2010-06-03 24 views
5

में मैं एक PrintQueue की PageMediaSize संग्रह एक ComboBox की ItemSource के लिए बाध्य कर रहा हूँ (यह ठीक काम करता है)। फिर मैं SelectedItemComboBoxPrintQueue के DefaultPrintTicket.PageMediaSize पर SelectedItem बाध्यकारी हूं। हालांकि यह चयनित मान DefaultPrintTicket.PageMediaSize पर सेट करेगा ठीक है, यह ComboBox के प्रारंभिक रूप से चयनित मान को DefaultPrintTicket.PageMediaSize के प्रारंभिक मान पर सेट नहीं करता है क्योंकि यह DefaultPrintTicket.PageMediaSize संदर्भ संग्रह में किसी भी संदर्भ से मेल नहीं खाता है। हालांकि मैं नहीं चाहता कि यह संदर्भ के अनुसार वस्तुओं की तुलना करें, लेकिन इसके बजाय मूल्य के अनुसार, लेकिन PageMediaSize बराबर ओवरराइड नहीं करता है (और मेरे पास इसका कोई नियंत्रण नहीं है)। मैं वास्तव में क्या करना चाहूंगा IComparableComboBox के लिए उपयोग करने के लिए, लेकिन मुझे ऐसा करने का कोई तरीका नहीं दिख रहा है। मैंने Converter का उपयोग करने का प्रयास किया है, लेकिन मुझे मूल्य से अधिक की आवश्यकता होगी और मुझे पता नहीं लगा कि संग्रह को ConverterProperty पर कैसे पास किया जाए। इस समस्या को संभालने के तरीके पर कोई विचार।WPF ComboBox SelectedItem के लिए बाध्य जब संदर्भ नहीं ItemsSource

यहाँ मेरी 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"/> 

और वह 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(); 
    } 
} 

संपादित

मैं में इसी संदर्भ को DefaultPrintTicket.PageMediaSize स्थापित करने की कोशिश की कनवर्टर के लिए कोड है InitializeComponent से पहले संग्रह, लेकिन यह बुरा नहीं था कश्मीर। यह निश्चित रूप से मूल्य निर्धारित करता है जब मैं ComboBox से कुछ चुनता हूं, लेकिन ऐसा लगता है कि यह दूसरी तरफ नहीं लगता है।

उत्तर

1

PageMediaSize के लिए एक रैपर वर्ग बनाना संभव है और इस रैपर वर्ग में Equals(object) विधि को ओवरराइड करना संभव होगा? फिर आप अपने संग्रह में इस रैपर वर्ग का उदाहरण जोड़ सकते हैं, ताकि वे अब संदर्भ से तुलना नहीं कर सकें। बेशक, आपको अपने PageMediaSize उदाहरण लपेटने और अनचाहे करने के लिए कुछ कोड की आवश्यकता होगी, लेकिन यह कल्पना करने का सबसे अच्छा तरीका है।

1

जुहरर के उत्तर के आगे, आप ऑब्जेक्ट को लपेटने और खोलने के लिए कनवर्टर का उपयोग कर सकते हैं।

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

फिर अपने कनवर्टर

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

XAML में घोषित, दोनों ItemSource और चयनित आइटम पर कनवर्टर का उपयोग करें।

<ComboBox                
    ItemsSource="{Binding MySource, Converter={StaticResource toTypeEqualityWrapper}}" 
    SelectedItem="{Binding MySelectedItem, Converter={StaticResource toTypeEqualityWrapper}}"                
    DisplayMemberPath="Value.DisplayName" /> 
संबंधित मुद्दे