2012-06-02 24 views
0

可以使用带List的IValueConverter。它可以在第一次使用菜单时使用。当我更新列表中的项目时,它不会再次调用IValueConverter? 例子:WPF:带列表的IValueConverter

    <MenuItem Header="{Binding Path=DataContext.Documents, RelativeSource={RelativeSource FindAncestor, 
    AncestorType={x:Type ListView}}, Converter={StaticResource DocumentsToString}, Mode=OneWay}"> 
        <MenuItem.Icon> 
         <Image Source="Images/upload.png" Style="{StaticResource ImageContextMenu}"/> 
        </MenuItem.Icon> 
       </MenuItem> 

而且ValueConverters.cs

public class ListDocumentToStringConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var selectedDocuments = (ObservableCollection<Document>) value; 
     var result = ""; 
     foreach (var document in selectedDocuments) 
     { 
      result += document.Name + "\t"; 
     } 
     return result; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

转换器仅在'Documents'属性获得新值时才被调用;如果'Documents'属性引用的集合保持不变,即使将“Document”项添加到该集合,转换器也不会被调用。你真的想把所有的文档名称写入一个'MenuItem'吗?或者你想为每个文档创建一个'MenuItem'?如果后者是这种情况,请将您的集合分配给'Menu.ItemsSource'。 – 2012-06-02 05:40:18

+0

我使用Document.SelectedCount,如果我点击Document中的另一个项目,它再次调用转换器 –

回答

0

为了增加fmunkert的评论是正确的,如果你打算举办一个菜单项中的所有这些项目,你可以喜欢写东西这个:

<MenuItem> 
    <MenuItem.Header> 
     <ItemsControl ItemsSource="{Binding Path=DataContext.Documents, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Name}" /> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </MenuItem.Header> 
    <MenuItem.Icon> 
     <Image Source="Images/upload.png" Style="{StaticResource ImageContextMenu}"/> 
    </MenuItem.Icon> 
</MenuItem> 

这样你就不必使用转换器了。如果你想改变这些项目相对于彼此的布局方式,比如在你的示例中使用两个选项卡,那么你会想要模拟ItemsControl的ItemsPanel。默认情况下它是一个垂直的StackPanel。你可以将其更改为水平的StackPanel像这样:

<ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <StackPanel Orientation="Horizontal" /> 
    </ItemsPanelTemplate> 
</ItemsControl.ItemsPanel> 

然后你就可以添加间距或保证金给每个TextBlock的项目,实现视觉但是你想。