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?
Yep - super. A travaillé comme un champion. C'est une bonne journée - j'ai appris quelque chose. :) – itsmatt