Associazione in WPF all’elemento della matrice specificato dalla proprietà

Dite che ho alcuni TextBlocks sulla mia interfaccia utente, qualcosa del genere:

     

e nel mio codice dietro ho qualcosa del genere:

 public partial class MainWindow : Window { public int DessertIndex { get { return 2; } } public object[] Food { get { return new object[]{"liver", "spam", "cake", "garlic" }; } } public MainWindow() { InitializeComponent(); DataContext = this; } } 

I primi due TextBlocks mi mostrano bene, visualizzando rispettivamente 2 e ‘cake’. Il terzo non realizza ciò che mi piacerebbe, vale a dire utilizzare la proprietà DessertIndex per indicizzare in quell’array e visualizzare anche “torta”. Ho fatto un po ‘di ricerche qui su SO per una domanda simile ma non l’ho trovata. In definitiva, non voglio specificare valori come 2 nel mio file .xaml e vorrei fare affidamento su una proprietà invece per l’indicizzazione in quell’array. È ansible? Se sì, cosa sto sbagliando qui?


MODIFICARE:

Quindi quello che ho più vicino è una situazione in cui i dati sono una lista di questi oggetti [] e sto usando lo StackPanel sopra come parte di un DataTemplate per un ListBox. Quindi l’idea, come suggerisce Mark Heath in basso, di usare una proprietà che dereferenze alla matrice non sembra funzionare come vorrei. Idee?

Un’altra alternativa è usare MultiBinding con un convertitore:

                  

Quindi nel code-behind, il convertitore è definito in questo modo:

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

se hai intenzione di avere una proprietà DesertIndex sul tuo DataContext, perché non una proprietà che dereferenzia l’array Food con DesertIndex:

 public object SelectedFood { get { return Food[DessertIndex]; } } public int DessertIndex { get { return 2; } } public object[] Food { get { return new object[]{"liver", "spam", "cake", "garlic" }; } } 

allora puoi bind direttamente a quello:

  

Questo è essenzialmente l’approccio “MVVM”: rendere l’object datacontext con proprietà che sono giuste per il binding.