我正在尝试设置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