0

可以将 IValueConverter 与 List 一起使用。它可以在我第一次调用菜单时使用。当我更新列表中的项目时,它不会再次调用 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();
    }
}
4

1 回答 1

0

要添加正确的 fmunkert 评论,如果您打算在单个 MenuItem 中托管所有这些项目,您可以编写如下内容:

<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。您可以将其更改为 Horizo​​ntal StackPanel,如下所示:

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

然后,您可以为每个 TextBlock 项目添加间距或边距,以实现您想要的视觉效果。

于 2012-06-02T06:45:43.110 回答