2010-11-05 9 views
0

Dans un related question j'ai demandé la liaison à un élément particulier d'un tableau indexé par une autre propriété. La réponse fournie a très bien fonctionné pour l'exemple de code fourni. Où je suis en difficulté, c'est que je spécifie un ItemSource pour un ListBox et j'obtiens un DependencyProperty.UnsetValue dans mon convertisseur quand je le traverse. Aucun doute que c'est un problème avec ma compréhension de la liaison.WPF ListBox Binding ItemsSource

Mon ListBox ressemble à ceci:

<ListBox ItemsSource="{Binding Path=MyList}"> 
    <ListBox.Resources> 
     <local:FoodIndexConverter x:Key="indexConverter" /> 
    </ListBox.Resources> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock> 
       <TextBlock.Text> 
        <MultiBinding Converter="{StaticResource indexConverter}"> 
         <Binding Path="MyIndex" /> 
         <Binding Path="Fields" /> 
        </MultiBinding> 
       </TextBlock.Text> 
      </TextBlock> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

et le code regarde derrière comme si:

public MainWindow() 
{ 
    InitializeComponent(); 
    MyList.Add(new SomeData() { Fields = new object[] {"liver", "onions", "cake" } }); 
    MyList.Add(new SomeData() { Fields = new object[] {"liver", "onions", "candy" } }); 
    MyList.Add(new SomeData() { Fields = new object[] {"liver", "onions", "pie" } }); 

    DataContext = this; 
} 

MyList est une liste.

MyIndex est un int.

Le code de convertisseur est

public class FoodIndexConverter : IMultiValueConverter 
    { 
     public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (values == null || values.Length != 2) 
       return null; 

      int? idx = values[0] as int?; 
      object[] food = values[1] as object[]; 

      if (!idx.HasValue || food == null) 
       return null; 

      return food[idx.Value]; 
     } 

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

Quand j'étape à travers le débogueur dans le code de conversion du MyIndex (valeur [0]) est DependencyProperty.UnsetValue - la matrice de l'objet est que je prévois.

Je suppose que c'est un problème de liaison avec: en ce qu'il ne sait pas ce qu'est MyIndex.

Si MyIndex était une propriété de la classe SomeData, cela fonctionne comme je l'attendais mais ce n'est pas le cas, c'est une propriété de la classe MainWindow, tout comme MyList.

Comment spécifier que la propriété MyIndex qui fait partie de mon DataContext et non la liste MyData m'intéresse?

Répondre

1

Il recherche la propriété MyIndex sur ListBoxItem (dans ce cas, une classe SomeData) et cette propriété n'existe pas.

Définissez le nom d'élément dans votre liaison au nom de la fenêtre pour qu'il recherche la propriété ailleurs.

<Binding ElementName=RootWindow, Path=DataContext.MyIndex /> 
+0

Yep - super. A travaillé comme un champion. C'est une bonne journée - j'ai appris quelque chose. :) – itsmatt