Связывание в WPF с элементом массива, заданным свойством
Скажем, у меня есть некоторые текстовые блоки в моем пользовательском интерфейсе, что-то вроде этого:
и в моем коде позади у меня есть что-то вроде этого:
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; } }
Первые два TextBlocks отображаются отлично для меня, отображая 2 и «cake» соответственно. Третий не выполняет то, что я хотел бы, а именно использовать свойство DessertIndex для индексации в этот массив, а также отображать «cake». Я немного искал здесь на SO для аналогичного вопроса, но не нашел его. В конечном счете, я не хочу указывать такие значения, как 2 в моем .xaml-файле, и хотел бы полагаться на свойство вместо этого для индексации в этот массив. Это возможно? Если да, то что я делаю неправильно здесь?
- WPF перед записью
- Привязка данных Android с использованием тега include
- ElementName привязка из MenuItem в ContextMenu
- WPF привязка данных к интерфейсу, а не к фактическому объекту - возможность литья?
- WPF: привязка ContextMenu к команде MVVM
РЕДАКТИРОВАТЬ:
Так что я более тесно – это ситуация, когда данные являются списком этих объектов [], и я использую вышеуказанный StackPanel как часть DataTemplate для ListBox. Таким образом, идея, как предлагает Марк Хит, использовать свойство, которое разделяет массив, похоже, не работает так, как я бы хотел. Идеи?
- Как обнаружить сломанные привязки данных WPF?
- Заполнить Combobox из базы данных
- Привязать к методу в WPF?
- Связывающие свойства в коде
- Нажатие свойств GUI только для чтения обратно в ViewModel
- Можно ли связать свойство Canvas's Children в XAML?
- Когда следует использовать # и = в элементах управления ASP.NET?
- Обход проблемы из-за отсутствия оператора 'nameof' в C # для безопасного хранения данных по типу?
Другой альтернативой является использование MultiBinding с конвертером:
Затем в коде-коде конвертер определяется примерно так:
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(); } } }
если вы DesertIndex
с DesertIndex
свойства DesertIndex
в вашем DataContext, почему бы не свойство, которое разделяет массив Food с 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" }; } }
то вы можете напрямую связать с этим:
Это по существу подход «MVVM»: сделать объект datacontext имеющими свойства, которые подходят для привязки.