2010-02-04 15 views
5

Bu beni NUTS sürüyor!Bir WPF ComboBox'ta MultiBinding nasıl kullanılır

Çalışanların sorgusunu filtrelemek için kullanılan ancak yalnızca çalışanların adlarını yalnızca görüntüleyen ComboBox numaralı bir makinem var. Ben çalışanları tam adını görüntülemek için bir MultiValueConverter kullanmak istiyorum Aşağıda

gereksiz biçimlendirme kısalık için dışarı kesilmiş ile (benim çalışma kodu ve IMultiValueConverter Sınıf edilir (biz 2 Mikes ve 2 Daves yoktu, bu daha az acil olurdu)). MultiConverter'i işe almak için aklıma gelen her şeyi denedim ama şansım olmadı.

// This collection is used to populate the Employee Filter ComboBox 
private ObservableCollection<Employee> employeesFilter; 
public ObservableCollection<Employee> EmployeesFilter 
{ 
    get { 
      return employeesFilter; 
     } 
    set { 
     if (employeesFilter != value) 
     { 
      employeesFilter = value; 
      OnPropertyChanged("EmployeesFilter"); 
     } 
    } 
} 

// This property is TwoWay bound to the EmployeeFilters SelectedValue 
private Employee employeeToShow; 
public Employee EmployeeToShow 
{ 
    get { 
      return employeeToShow; 
     } 
    set { 
     if (employeeToShow != value) 
     { 
      employeeToShow = value; 
      OnPropertyChanged("EmployeeToShow"); 
      QueryIssues(); // Requery with new employee filter 
     } 
    } 
} 

IMultiValueConverter:

<ComboBox ItemsSource="{Binding Path=EmployeesFilter}" 
         DisplayMemberPath="EmpFirstName" 
         SelectedValue="{Binding Path=EmployeeToShow, Mode=TwoWay}"/> 

ViewModel Özellikleri

o bağlıdır farklı bir çok şey denedik ama temelde ComboBox aşağıdaki kullanıyorum

class StringsToFullNameMultiConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, 
          Type targetType, 
          object parameter, 
          System.Globalization.CultureInfo culture) 
    { 
     // I added this because I kept getting DependecyProperty.UnsetValue 
     // Passed in as the program initializes 
     if (values[0] as string != null) 
     { 
      string firstName = (string)values[0]; 
      string lastName = (string)values[1]; 
      string fullName = firstName + " " + lastName; 
      return fullName; 
     } 
     return null; 
    } 

    public object[] ConvertBack(object value, 
           Type[] targetTypes, 
           object parameter, 
           System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
} 

<ComboBox.SelectedValue> 
    <MultiBinding Converter="{StaticResource StringsToFullNameMultiConverter}" 
        Mode="OneWay" > 
      <Binding Path="EmpFirstName" /> 
      <Binding Path="EmpLastName"/> 
    </MultiBinding> 
</ComboBox.SelectedValue> 

Şimdi olduğu gibi, program DependencyProperty.UnsetValue'a ayarlanan değerler ile başlatıldığında dönüştürücü çağrılır. Bundan sonra kutudan bir isim seçtiğinizde bile bir daha asla çağrılmaz. İsimler hala bir ilk isim olarak görüntülenir.

Sağladığınız eğitici materyaller/örnekler için herhangi bir yardım veya işaretçi için teşekkür ederiz. Web'de bulmaya devam ettiğim her şey metin kutuları içindir ve bunları tüm gün gayet iyi kullanabilirim.

cevap

19

Kapatın! Yapmak istediğiniz şey ComboBox.ItemTemplate, SelectedValue değil. Bazı XAML cehennem için hazırlayın.

<ComboBox.ItemTemplate> 
    <DataTemplate> 
     <TextBlock> 
      <TextBlock.Text> 
       <MultiBinding Converter="{StaticResource StringsToFillNameMultiConverter}"> 
        <Binding Path="EmpFirstName" /> 
        <Binding Path="EmpLastName" /> 
       </MultiBinding> 
      </TextBlock.Text> 
     </TextBlock> 
    </DataTemplate> 
</ComboBox.ItemTemplate> 

Ayrıca, doğru hatırlıyorsam, dizeleri biçimlendiriyorsanız kendi dönüştürücünüzü oluşturmanız gerekmez. Ben aşağıdakileri yapabilirsiniz düşünmek (yanılıyorsam birisi bana lütfen düzeltin.)

<!-- "Last, First" --> 
<MultiBinding StringFormat="{}{1}, {0}"> 
    <Binding Path="EmpFirstName" /> 
    <Binding Path="EmpLastName" /> 
</MultiBinding> 
+0

Tuhaf olarak bu çalışır, ancak xaml bir hatayla okunabilir, hata "Özellik" Metni 'MultiBinding' türündeki değerleri desteklemez. " Eminim bu kolay bir çözüm olacak, fakat gerçek sorunum çözüldüğünden beri sabaha kadar bırakıyorum! Yardımın için çok teşekkürler, HATASIZ beni uyanık tutmak için çözülmemiş bir gizemle yatmaya gidiyorum. –

+0

Bu arada, dönüştürücü olmadan biçimlendirmek için sahip olduğunuz Kod mükemmel bir şekilde çalışıyor! –

+0

Bu garip bir hata. Yine de zararsız bir Cider böceği gibi görünüyor. – Josh

0

her kişi nasıl görüntüleneceğini üzerinde tam kontrole sahip, böylece öğeler için bir veri şablonu kullanarak daha iyi olabilir açılır listede.

Farklı alanların biçimlendirmesini denetlemeniz gerekmediğinden, tür dönüşümü tamamdır.

0

benim Class bir Readonly Mülkiyet addig ve comboboxdan

public class MyEmployee 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string DisplayName { 
    get { return FirstName + " " + LastName; } 
     } 
} 

yılında DisplayMemberPath kullanmak Olabilir durumunuza bu işi gibi bir şey ... tarafından sona erdi? BR, Daniel

+0

Dürüst olmak gerekirse, asıl soru 2010'dan ve benim radarımdan çok uzaktı :) –

+0

Onu gördüm ... Sadece birisinin kullanabileceği durumda 2Centimi göndermek istedim :) – dba

İlgili konular