Estoy intentando configurar un MenuItem
que tendrá un submenú de números de página que se pueden seleccionar. Quiero vincular ItemsSource
a una lista de números de página (en realidad, a PageCount con un convertidor que crea la lista) y luego vincular la propiedad IsChecked
de cada MenuItem
en el submenú al PageIndex. Mi problema es con el segundo enlace ya que también requiere un convertidor, pero ese convertidor necesita saber el número de página que representa el MenuItem
, pero no entiendo cómo pasar esa información al convertidor. Esto es lo que he intentado hasta ahora.Vinculando ItemsSource y IsChecked de un MenuItem para obtener una lista de elementos seleccionables en WPF
<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>
Por supuesto, el problema es que el ConverterParameter
no puede estar obligado, ya que no es un DependencyProperty
. Entonces mi pregunta es cómo puedo pasar la información que necesito o si hay otra manera de hacerlo.
Nota: Ya he intentado poner el MenuItem
s dentro de un ListBox
que funcionó muy bien en lo que respecta a las vinculaciones, pero hizo que el submenú se comportara de una manera no estándar. Es entonces cuando abrió el submenú, el ListBox
completo se trató como uno MenuItem
.
Editar
Así que aquí es lo que he llegado a trabajar hasta el momento. Intenté vincular a un ListBox
oculto pero cuando até el MenuItem.ItemsSource
al 'ListBox.Items' obtuve la lista de int
s en lugar de una lista de ListBoxItem
que necesitaba para obtener la propiedad IsSelected
. Así que terminé usando la sugerencia de Quartermeister de usar MultiBinding para obtener la propiedad IsChecked
para enlazar al PageIndex
en el modo OneWay
. Para manejar la otra dirección, utilicé un controlador de eventos en el evento Click
. Vale la pena señalar que al principio tenía IsCheckable
establecido en true
y estaba trabajando con el evento Checked
, pero que dio como resultado algunos comportamientos extraños.
<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>
Y aquí está el código
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);
}
}
}
esto no funciona para dos el enlace de ruta porque necesito saber el valor de 'Contenido' para ambas direcciones y solo se pasa al 'Convert' y no al' ConvertBack'. – juharr
Aunque esta idea no funcionó en ambas direcciones, me llevó a la mitad así que ganas. – juharr