Я пытаюсь настроить MenuItem
, который будет иметь подменю номеров страниц, которые можно выбрать. Я хочу связать ItemsSource
со списком номеров страниц (фактически с PageCount с конвертером, создающим список), а затем связать свойство IsChecked
каждого MenuItem
в подменю с PageIndex. Моя проблема связана со вторым связыванием, поскольку для него тоже требуется конвертер, но этому конвертеру нужно знать номер страницы, который представляет MenuItem
, но я не могу понять, как передать эту информацию конвертеру. Вот что я пробовал до сих пор.
<MenuItem Header="_Goto Page"
ItemsSource="{Binding
Path=CurrentImage.PageCount,
Converter={StaticResource countToList}}">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="IsCheckable"
Value="True"/>
<Setter Property="IsChecked"
Value="{Binding
ElementName=MainWindow,
Path=CurrentImage.PageIndex,
Mode=TwoWay,
Converter={StaticResource pageNumChecked},
ConverterParameter={Binding
RelativeSource={RelativeSource Self},
Path=Content}}"/>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
Конечно, проблема в том, что ConverterParameter
нельзя связать, поскольку это не DependencyProperty
. Поэтому мой вопрос заключается в том, как я могу передать необходимую информацию или есть другой способ сделать это.
Примечание: я уже пытался поместить MenuItem
в ListBox
, который работал очень хорошо с точки зрения привязок, но заставлял подменю вести себя нестандартным образом. То есть при открытии подменю весь ListBox
обрабатывался как один MenuItem
.
Редактировать
Итак, вот что я получил до сих пор. Я попытался связать со скрытым ListBox
, но когда я связал MenuItem.ItemsSource
с «ListBox.Items», я получил список int
s вместо списка ListBoxItem
s, который мне нужен для получения IsSelected
имущество. В итоге я использовал предложение Quartermeister использовать MultiBinding, чтобы привязать свойство IsChecked
к режиму PageIndex
в режиме OneWay
. Для обработки в другом направлении я использовал обработчик события Click
. Стоит отметить, что сначала я установил IsCheckable
на true
и работал с событием Checked
, но это привело к некоторым странным действиям.
<MenuItem x:Name="GotoPageMenuItem" Header="_Goto Page"
ItemsSource="{Binding Path=CurrentImage.PageCount,
Converter={StaticResource countToList}}">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="IsCheckable"
Value="False"/>
<EventSetter Event="Click"
Handler="GotoPageMenuItem_Click"/>
<Setter Property="IsChecked">
<Setter.Value>
<MultiBinding Converter="{StaticResource pageNumChecked}"
Mode="OneWay">
<Binding RelativeSource="{RelativeSource FindAncestor,
AncestorType={x:Type Window}}"
Path="CurrentImage.PageIndex"
Mode="OneWay"/>
<Binding RelativeSource="{RelativeSource Self}"
Path="Header"
Mode="OneWay"/>
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
А вот GotoPageMenuItem_Click
код
private void GotoPageMenuItem_Click(object sender, RoutedEventArgs e)
{
var item = sender as MenuItem;
if (item != null)
{
//If the item is already checked then we don't need to do anything
if (!item.IsChecked)
{
var pageNum = (int)item.Header;
CurrentImage.PageIndex = (pageNum - 1);
}
}
}