2010-06-03 37 views
5

Tôi đang ràng buộc bộ sưu tập PageMediaSize của PrintQueue vào ItemSource của một ComboBox (Điều này làm việc tốt). Sau đó, tôi ràng buộc số SelectedItem của số ComboBox vào số DefaultPrintTicket.PageMediaSize của số PrintQueue. Trong khi điều này sẽ đặt giá trị đã chọn thành DefaultPrintTicket.PageMediaSize tốt, nó không đặt giá trị được chọn ban đầu là ComboBox thành giá trị ban đầu là DefaultPrintTicket.PageMediaSize Điều này là do tham chiếu DefaultPrintTicket.PageMediaSize không khớp với bất kỳ tham chiếu nào trong bộ sưu tập. Tuy nhiên tôi không muốn nó so sánh các đối tượng bằng cách tham chiếu, nhưng thay vì bằng giá trị, nhưng PageMediaSize không ghi đè bằng (và tôi không kiểm soát được nó). Những gì tôi thực sự muốn làm là thiết lập một IComparable cho ComboBox để sử dụng, nhưng tôi không thấy bất kỳ cách nào để làm điều đó. Tôi đã cố gắng sử dụng Converter, nhưng tôi sẽ cần nhiều hơn giá trị và tôi không thể tìm ra cách chuyển bộ sưu tập đến số ConverterProperty. Bất kỳ ý tưởng về cách xử lý vấn đề này.WPF ràng buộc với ComboBox SelectedItem khi tham chiếu không có trong ItemsSource

Dưới đây là XAML của tôi

<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"/> 

Và mã cho bộ chuyển đổi mà được các PageMediaSize bộ sưu tập

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

Sửa

tôi đã cố gắng thiết lập các DefaultPrintTicket.PageMediaSize để tham chiếu tương ứng trong bộ sưu tập trước InitializeComponent, nhưng điều đó không k. Nó chắc chắn thiết lập giá trị khi tôi chọn một cái gì đó từ ComboBox, nhưng nó dường như không đi theo cách khác.

Trả lời

1

Có thể tạo lớp bao bọc cho PageMediaSize và ghi đè phương thức Equals(object) trong lớp trình bao bọc này không? Sau đó, bạn có thể thêm thể hiện của lớp trình bao bọc này vào bộ sưu tập của bạn để chúng không còn được so sánh bằng tham chiếu nữa. Tất nhiên, bạn sẽ cần một số mã để gói và unwrapping PageMediaSize trường hợp của bạn, nhưng đó là cách tốt nhất tôi có thể tưởng tượng.

1

Ngoài câu trả lời của juharr, bạn có thể sử dụng trình biến đổi để bọc và tháo vật thể ra.

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

Sau đó tuyên bố chuyển đổi của bạn

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

Trong XAML, sử dụng bộ chuyển đổi trên cả hai ItemSource và Selected Item.

<ComboBox                
    ItemsSource="{Binding MySource, Converter={StaticResource toTypeEqualityWrapper}}" 
    SelectedItem="{Binding MySelectedItem, Converter={StaticResource toTypeEqualityWrapper}}"                
    DisplayMemberPath="Value.DisplayName" /> 
Các vấn đề liên quan