4

次のクラス定義を想定します。


    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>

問題は、DataProvider メニュー項目の ICommand データ バインディングを作成し、コマンドの Execute メソッド内でデータ型 (列挙型) とデータ プロバイダー (IDataProvider インターフェイス) を取得する方法です。

更新 次のような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 は、このコマンド クラスのインスタンスをプロパティとして公開します。

4

1 に答える 1

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>
于 2011-05-11T10:23:45.133 に答える