WPF: привязать DisplayMemberPath в поле со списком к элементу
Хорошо, это немного странно, но это в основном то, что мне нужно делать. У меня есть элемент управления WPF, связанный с объектом Document. Объект Document имеет свойство Pages. Поэтому в моей модели ViewModel у меня есть свойство CurrentDocument и свойство CurrentPage.
Теперь у меня есть поле со списком, которое связано с свойством CurrentDocument.Pages и обновляет свойство CurrentPage.
<ComboBox ItemsSource="{Binding CurrentDocument.Pages}"
DisplayMemberPath="???"
SelectedItem="{Binding CurrentPage, Mode=TwoWay}">
</ComboBox>
Со мной до сих пор? Все это прекрасно, за исключением того, что мне нужно, чтобы DisplayMemberPath отображал "Страница 1", "Страница 2" и т.д.
Я попытался создать такой конвертер, как это:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string pageNumber = "Page {0}";
return string.Format(pageNumber, value);
}
И попытался связать DisplayMemberPath с ним следующим образом:
DisplayMemberPath="{Binding RelativeSource={RelativeSource Self}, Path=Index, Converter={StaticResource pgTitleConv}}"
Но он все равно не появится в тексте со списком!
Нет свойства "Index", но я не знаю, как это сделать... Как мне получить доступ к индексу элемента, связанного со списком,...??????
Ответы
Ответ 1
попробуйте следующее:
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource pgTitleConv}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
и в вашем valueconverter, если вы можете получить доступ к коллекции страниц, вы можете использовать CurrentDocument.Pages.IndexOf(значение), чтобы получить индекс связанного элемента. Я уверен, что есть лучший способ.
Ответ 2
Хорошо, спасибо Botz3000 Я понял, как это сделать. (Это немного парик, но он отлично работает.)
Внезапно он пришел ко мне: объект страницы имеет объект Document!! Doh!!
Итак, мой PageTitleConvert
просто делает это:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null)
{
ImGearPage page = (ImGearPage)value;
ImGearDocument doc = page.Document;
int pageIndex = doc.Pages.IndexOf(page);
pageIndex++;
return string.Format("Page {0}", pageIndex);
}
return null;
}