wpf data-binding menu icommand

WPF ContextMenu Dictionary<Key, List<Value>> databinding



data-binding icommand (1)

El problema ha sido resuelto:

<UserControl x:Class="DataProvidersView" ... <ContextMenu.ItemContainerStyle> <Style TargetType="{x:Type MenuItem}"> <Setter Property="Command" Value="{Binding Path=DataContext.DataProviderSwitchCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type vw:DataProvidersView}}}" /> <Setter Property="CommandParameter"> <Setter.Value> <MultiBinding> <Binding Path="DataContext.Key" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}" /> <Binding /> </MultiBinding> </Setter.Value> </Setter> </Style> </ContextMenu.ItemContainerStyle> </UserControl>

Asume las siguientes definiciones de clase.

public enum ContentType { Playlist, Audio, Video, Picture } public interface IDataProvider { string Name { get; } } public class ProviderList : List<IDataProvider> { } public class MainViewModel { public Dictionary<ContentType, ProviderList> ProvidersDictionary; public MainViewModel() { if (IsInDesignMode) { // Code runs in Blend --> create design time data. } else { // Code runs "for real" this.ProvidersDictionary = new Dictionary<ContentType, ProviderList>(); ProviderList providerList = new ProviderList(); providerList.Add(new DataProvider()); this.ProvidersDictionary.Add(ContentType.Audio, providerList); providerList = new ProviderList(providerList); providerList.Add(new DataProvider()); this.ProvidersDictionary.Add(ContentType.Video, providerList); } } }

Por lo tanto, esta propiedad ProvidersDictionary está vinculada al menú contextual de la ventana de la siguiente manera:

<Window.ContextMenu> <ContextMenu ItemsSource="{Binding ProvidersDictionary}"> <ContextMenu.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Value}"> <TextBlock Margin="1" Text="{Binding Key}" Height="20"/> <HierarchicalDataTemplate.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Name}" /> </DataTemplate> </HierarchicalDataTemplate.ItemTemplate> </HierarchicalDataTemplate> </ContextMenu.ItemTemplate> </ContextMenu> </Window.ContextMenu>

La pregunta es: cómo hacer que el enlace de datos de ICommand para el elemento del menú DataProvider haga clic y recuperar el tipo de datos (tipo de enumeración) y el proveedor de datos (interfaz IDataProvider) dentro del comando ''Ejecutar método.

Actualización Quiero que alguna clase de comando se vincule a MenuItems como:

class DataProviderMenuSelectCommand : ICommand { #region ICommand Members public void Execute(object parameter) { ContentTypeProviderPair contentProviderPair = parameter as ContentTypeProviderPair; if (contentProviderPair != null) { // contentProviderPair.Type property - ContentType // contentProviderPair.Provider property - IProvider } } }

MainViewModel expondrá la instancia de esta clase de comando como una propiedad.