使用MenuMemeberBinding为MenuItem进行MultiBinding

时间:2013-09-16 23:50:39

标签: c# wpf binding menuitem

我有以下XAML

<MenuItem Header="_Recent Studies"
            Height="22" 
            ItemsSource="{Binding RecentFiles}">
    <MenuItem.Resources>
        <Style TargetType="{x:Type MenuItem}" BasedOn="{StaticResource {x:Type MenuItem}}">
            <Setter Property="Header" Value="{Binding FullFileName}"/>
        </Style>
    </MenuItem.Resources>
</MenuItem>

显示了我最近的文件,如

Recents

但是,我想在VS2012上显示文件名旁边的MenuItem的项目编号。

  
      
  1. FileNameA.f
  2.   
  3. FileNameB.x
  4.   
  5. FileNameC.j
  6.   

等。为了做到这一点,我决定使用转换器如果我只是获取没有文件名的数字我可以this。但我希望将其与多重绑定相结合,以便我可以编写类似

的内容
<MultiBinding StringFormat="{}{0}. {1}">
    <Binding Path="??"/> 
    <Binding Path="FullFileName"/>
</MultiBinding>

我不知道上面写的是什么。 如何在文件名称前加上文件在列表中的编号,而不向我的FullFileName添加索引属性会使事情变得更复杂?

感谢您的时间。


编辑。这就是我在代码中使用以下答案的方法

<MenuItem Header="_FILE">
    ...
    <MenuItem Header="_Recent Studies" 
              ItemsSource="{Binding RecentFiles}" 
              AlternationCount="{Binding RecentFiles.Count}" 
              HeaderTemplate="{x:Null}">
        <MenuItem.Resources>
            <Style TargetType="{x:Type MenuItem}" 
                   BasedOn="{StaticResource {x:Type MenuItem}}">
                <Setter Property="HeaderTemplate" >
                   <Setter.Value>
                      <DataTemplate>
                         <TextBlock>
                            <TextBlock.Text>
                               <MultiBinding StringFormat="{}{0}. {1}">
                                  <Binding Path="(ItemsControl.AlternationIndex)" 
                                           RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type MenuItem}}" 
                                           Converter="{StaticResource IntPlusNConverter}"/>
                                  <Binding Path="FullFileName"/>
                               </MultiBinding>
                            </TextBlock.Text>
                         </TextBlock>
                      </DataTemplate>
                   </Setter.Value>
                </Setter>
            </Style>
        </MenuItem.Resources>
    </MenuItem>
    <Separator/>
        <MenuItem Header="E_xit" 
                  Height="22"
                  Icon="{Binding Source={StaticResource Close}, 
                                 Converter={StaticResource drawingBrushToImageConverter}}"
                  Command="{Binding ExitCommand}" />
</MenuItem>

这个有效!但是,我的FILE MenuItem块的所有XAML都被突出显示,我得到一个编译时错误(代码运行并且正常工作!),说

  

“System.Windows.StaticResourceExtension”类型的对象不能应用于需要“System.Windows.Style”类型的属性。

为什么会发生这种情况,我该如何解决?

感谢您的时间。


RESULT!

enter image description here

1 个答案:

答案 0 :(得分:1)

您应该可以使用此答案中的AlternationIndex

进行此操作

Finding Listbox Index of ListBoxItem (ItemsTemplate to specify Visual COntent)

您可能必须覆盖HeaderTemplate,因为StringFormat可能无法正常运行,因为Headerobject而不是string

示例:

<MenuItem Header="_Recent Studies"  ItemsSource="{Binding RecentFiles}" AlternationCount="{Binding RecentFiles.Count}" HeaderTemplate="{x:Null}">
    <MenuItem.Resources>
        <Style TargetType="{x:Type MenuItem}" BasedOn="{StaticResource {x:Type MenuItem}}">
            <Setter Property="HeaderTemplate" >
                <Setter.Value>
                    <DataTemplate>
                        <TextBlock>
                            <TextBlock.Text>
                                <MultiBinding StringFormat="{}{0}. {1}">
                                   <Binding Path="(ItemsControl.AlternationIndex)" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type MenuItem}}" />
                                   <Binding Path="FullFileName"/>
                                </MultiBinding>
                            </TextBlock.Text>
                        </TextBlock>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </MenuItem.Resources>
</MenuItem>

结果:

enter image description here