0

List で IValueConverter を使用できます。初めてメニューを呼び出すときに使用できます。リスト内のアイテムを更新すると、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 に答える