2010-11-09 31 views
4

Supposez les définitions de classe suivantes.WPF ContextMenu Dictionnaire <clé, liste <Value>> liaison de données


    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); 
      } 
     } 
    } 

Ainsi, cette propriété ProvidersDictionary est lié au menu contextuel de la fenêtre comme suit:


    <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 question est la suivante: comment faire ICommand databinding pour le clic de l'élément de menu DataProvider et pour récupérer le type de données (ENUM type) et le fournisseur de données (interface IDataProvider) dans la commande 'Execute method.

Mise à jour Je veux avoir une classe de commande pour être lié à MenuItems comme:


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 exposeront instance de cette classe de commande comme une propriété.

Répondre

0

Le problème a été résolu:

<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>