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;
}