Sto tentando di impostare un MenuItem
che avrà un sottomenu di numeri di pagina che possono essere selezionati. Voglio associare lo ItemsSource
a un elenco di numeri di pagina (in realtà al PageCount con un convertitore che crea l'elenco) e quindi associare la proprietà IsChecked
di ogni MenuItem
nel sottomenu a PageIndex. Il mio problema è con il secondo binding poiché richiede anche un convertitore, ma quel convertitore deve conoscere il numero di pagina che rappresenta il MenuItem
, ma non riesco a capire come passare tali informazioni al convertitore. Ecco cosa ho provato finora.Binding ItemsSource e IsChecked di un MenuItem per ottenere un elenco di elementi controllabili in 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>
Naturalmente il problema è che il ConverterParameter
non può essere vincolato in quanto non è un DependencyProperty
. Quindi la mia domanda è come posso passare le informazioni di cui ho bisogno o c'è un altro modo per farlo.
Nota: Ho già provato a mettere le MenuItem
s all'interno di un ListBox
che ha funzionato molto bene per quanto riguarda le associazioni sono interessati, ma ha causato il sottomenu per comportarsi in modo non standard. Questo è quando hai aperto il sottomenu l'intero ListBox
è stato trattato come uno MenuItem
.
Modifica
Così qui è quello che ho avuto modo di lavorare fino ad ora. Ho provato il binding a un ListBox
nascosto, ma quando ho associato il MenuItem.ItemsSource
a "ListBox.Items" ho ottenuto l'elenco di int
s invece di un elenco di ListBoxItem
s che avevo bisogno di ottenere la proprietà IsSelected
. Così ho finito per usare il suggerimento di Quartermeister di usare MultiBinding per ottenere la proprietà IsChecked
da associare allo PageIndex
nella modalità OneWay
. Per gestire l'altra direzione, ho utilizzato un gestore di eventi sull'evento Click
. Vale la pena notare che inizialmente avevo IsCheckable
impostato su true
e che funzionava con l'evento Checked
, ma ne derivavano alcuni comportamenti strani.
<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>
Ed ecco il codice di 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);
}
}
}
Questo non funziona per due -way binding perché ho bisogno di conoscere il valore 'Content' per entrambe le direzioni e viene passato solo a' Convert' e non a 'ConvertBack'. – juharr
Anche se questa idea non ha funzionato in entrambe le direzioni, mi ha portato a metà strada così, hai vinto. – juharr