2010-11-09 147 views
4

假设以下类定义。WPF ContextMenu Dictionary <Key,List <Value>>数据绑定


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

所以,这ProvidersDictionary属性绑定到窗口右键菜单如下:


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

的问题是:如何让ICommand的数据绑定的DataProvider的菜单项,点击检索的数据类型(枚举类型)和数据提供者(IDataProvider接口)在命令'Execute方法。

更新 我希望有一些命令类绑定到的MenuItems,如:


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将公开此命令类的实例作为属性。

回答

0

的问题已经得到解决:

<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> 
相关问题