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
,它结合了一个自定义项目以及OpenFiles
和ActiveRecords
集合中的项目。
<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>对象类型?
答案 0 :(得分:1)
如果我需要
ItemContainerStyle
来设置图标,如何根据对象类型更改绑定路径(IconGeometry
与RecordIconGeometry
)?
您可以使用返回相应对象的转换器:
<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
运算符。