2009-11-24 6 views
3

J'ai eu une propriété Indexer dans une classe appelée X, supposons X[Y] me donne un autre objet de type Z:XAML Indexer DataBinding

<ContentControl Content="{Binding X[Y]}" ...??? 

Comment puis-je faire un DataBinding arrive à l'intérieur du indexeur? Cela fonctionne si je fais {Binding [0]}. Mais {Binding X[Y]} prend juste le paramètre d'indexeur comme une chaîne qui est Y.

Mise à jour: Converter est une option, mais j'ai beaucoup de classes ViewModel avec indexeur et ne dispose pas d'une collection similaire, donc je ne peux pas se permettre de faire des convertisseurs séparés pour tous ceux. Donc, je voulais juste savoir que cela est pris en charge dans WPF si oui, comment déclarer Content=X[Y]X et Y sont DataContext propriétés?

Répondre

2

La seule façon que j'ai trouvé pour accomplir ceci est à travers un MultiBinding et un IMultiValueConverter.

<TextBlock DataContext="{Binding Source={x:Static vm:MainViewModel.Employees}"> 
    <TextBlock.Text> 
     <MultiBinding Converter="{StaticResource conv:SelectEmployee}"> 
      <Binding /> 
      <Binding Path="SelectedEmployee" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

Et votre convertisseur:

public class SelectEmployeeConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     Debug.Assert(values.Length >= 2); 

     // change this type assumption 
     var array = values[0] as Array; 
     var list = values[0] as IList; 
     var enumerable = values[0] as IEnumerable; 
     var index = Convert.ToInt32(values[1]); 

     // and check bounds 
     if (array != null && index >= 0 && index < array.GetLength(0)) 
      return array.GetValue(index); 
     else if (list != null && index >= 0 && index < list.Count) 
      return list[index]; 
     else if (enumerable != null && index >= 0) 
     { 
      int ii = 0; 
      foreach (var item in enumerable) 
      { 
       if (ii++ == index) return item; 
      } 
     } 

     return Binding.DoNothing; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, 
     object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Ouais merci, ce qui est la solution évidente s'il n'y a qu'une seule classe. Mais j'ai beaucoup de classes ViewModel similaires à ceci Donc je ne peux pas me permettre d'avoir des convertisseurs séparés, Au lieu de cela, je change la logique de l'indexeur à quelque chose d'autre. –

+0

Je suis allé de l'avant et mis à jour cela pour travailler à travers une multitude de types de collections. – user7116