如何在WPF中的ContextMenu中组合多个集合的样式?

时间:2017-10-01 14:23:47

标签: c# wpf xaml contextmenu

public class MainViewModel
{
    public MainViewModel()
    {
        var iconGeometry = Geometry.Parse("M150 0 L75 200 L225 200 Z");
        OpenFiles =
            new ObservableCollection<File>()
            {
                new File { IconGeometry = iconGeometry, Filename = "Document.docx" },
                new File { IconGeometry = iconGeometry, Filename = "Evidence.xlsx" }
            };

        ActiveRecords =
            new ObservableCollection<Record>()
            {
                new Record { RecordIconGeometry = iconGeometry, Name = "The First Record" }
            };
    }

    public ObservableCollection<File> OpenFiles { get; set; }

    public ObservableCollection<Record> ActiveRecords { get; set; }
}

根据MainViewModel,我想创建一个ContextMenu,它结合了一个自定义项目以及OpenFilesActiveRecords集合中的项目。

<ContextMenu>
    <ContextMenu.Resources>
        <CollectionViewSource x:Key="ActiveRecordsCollectionSource"
                                Source="{Binding ActiveRecords}" />
        <CollectionViewSource x:Key="OpenFileCollectionSource"
                                Source="{Binding OpenFiles}" />
        <DataTemplate DataType="{x:Type local:File}">
            <TextBlock><Run Text="Close " /><Run Text="{Binding FileName}" /></TextBlock>
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:Record}">
            <TextBlock><Run Text="Close " /><Run Text="{Binding Label}" /></TextBlock>
        </DataTemplate>
    </ContextMenu.Resources>
    <ContextMenu.ItemsSource>
        <CompositeCollection>
            <CollectionContainer Collection="{Binding Source={StaticResource ActiveRecordsCollectionSource}}" />
            <Separator />
            <CollectionContainer Collection="{Binding Source={StaticResource OpenFileCollectionSource}}" />
            <Separator />
            <MenuItem Header="Close All">
                <MenuItem.Icon>
                    <Path Width="16"
                            Height="16"
                            Fill="Black"
                            Stretch="Uniform"
                            Data="M10.185,1.417c-4.741,0-8.583,3.842-8.583,8.583c0,4.74,3.842,8.582,8.583,8.582S18.768,14.74,18.768,10C18.768,5.259,14.926,1.417,10.185,1.417 M10.185,17.68c-4.235,0-7.679-3.445-7.679-7.68c0-4.235,3.444-7.679,7.679-7.679S17.864,5.765,17.864,10C17.864,14.234,14.42,17.68,10.185,17.68 M10.824,10l2.842-2.844c0.178-0.176,0.178-0.46,0-0.637c-0.177-0.178-0.461-0.178-0.637,0l-2.844,2.841L7.341,6.52c-0.176-0.178-0.46-0.178-0.637,0c-0.178,0.176-0.178,0.461,0,0.637L9.546,10l-2.841,2.844c-0.178,0.176-0.178,0.461,0,0.637c0.178,0.178,0.459,0.178,0.637,0l2.844-2.841l2.844,2.841c0.178,0.178,0.459,0.178,0.637,0c0.178-0.176,0.178-0.461,0-0.637L10.824,10z" />
                </MenuItem.Icon>
            </MenuItem>
        </CompositeCollection>
    </ContextMenu.ItemsSource>
</ContextMenu>

如何样式项目以显示图标名称?如果我需要ItemContainerStyle来设置图标,如何根据<<更改绑定路径( IconGeometry RecordIconGeometry ) strong>对象类型?

1 个答案:

答案 0 :(得分:1)

  

如果我需要ItemContainerStyle来设置图标,如何根据对象类型更改绑定路径(IconGeometryRecordIconGeometry)?

您可以使用返回相应对象的转换器:

<ContextMenu>
    <ContextMenu.Resources>
        ...
        <local:Converter x:Key="conv" />
    </ContextMenu.Resources>
    <ContextMenu.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Icon" Value="{Binding Path=., Converter={StaticResource conv}}" />
        </Style>
    </ContextMenu.ItemContainerStyle>
</ContextMenu>
public class Converter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        File file = value as File;
        if (file != null)
            return file.IconGeometry;

        Record record = value as Record;
        if (record != null)
            return record.RecordIconGeometry;

        return value;
    }

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

我担心无法调用GetType()方法或在XAML中使用as运算符。