我正在嘗試設置MenuItem
,這將有一個可以選擇的頁碼子菜單。我想將ItemsSource
綁定到頁碼列表(實際上是通過創建列表的轉換器將其綁定到PageCount),然後將子菜單中每個MenuItem
的IsChecked
屬性綁定到PageIndex。我的問題是第二個綁定,因爲它也需要一個轉換器,但該轉換器需要知道MenuItem
代表的頁碼,但我不知道如何將該信息傳遞給轉換器。這是迄今爲止我嘗試過的。綁定ItemsSource和IsChecked的MenuItem以獲取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>
當然,問題是,ConverterParameter
不能被綁定,因爲它不是一個DependencyProperty
。所以我的問題是如何傳遞我需要的信息,或者有另一種方式來實現這一點。
注意:我已經試過把MenuItem
放在ListBox
的內部,就綁定而言效果很好,但是導致子菜單以非標準方式運行。那就是當你打開子菜單時,整個ListBox
被當作一個MenuItem
。
編輯
所以這裏就是我已經得到了工作至今。我嘗試綁定到隱藏的ListBox
,但是當我將MenuItem.ItemsSource
綁定到'ListBox.Items'時,我得到了int
s的列表,而不是我需要獲得IsSelected
屬性的列表ListBoxItem
。所以我最終使用Quartermeister的建議,使用MultiBinding來獲取IsChecked
屬性以模式綁定到PageIndex
。爲了處理另一個方向,我在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);
}
}
}
這並不適用於兩項工作因爲我需要知道兩個方向的Content值,並且只傳遞給Convert而不是ConvertBack。 – juharr 2010-06-25 13:03:29
即使這個想法在兩個方向都不起作用,它讓我在那裏一半,所以,你贏了。 – juharr 2010-06-25 21:27:22