2

コンテキストメニューがあり、そのメニュー項目をバインディングを介して入力したいと思います。次のコードは機能します

<Button>
    <controlsInputToolkit:ContextMenuService.ContextMenu>
        <controlsInputToolkit:ContextMenu ItemsSource="{Binding MenuItems}">
            <controlsInputToolkit:ContextMenu.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" />
                </DataTemplate>
            </controlsInputToolkit:ContextMenu.ItemTemplate>
        </controlsInputToolkit:ContextMenu>
    </controlsInputToolkit:ContextMenuService.ContextMenu>
</Button>

ただし、問題が1つあります。これは、ItemTemplateがメニュー項目のテキスト領域を表しているため、認識していない限り、アイコンを設定できないということです。

以下の例のように、ItemContainerStyleを介してバインディングを実行してみました

<Button>
    <controlsInputToolkit:ContextMenuService.ContextMenu>
        <controlsInputToolkit:ContextMenu ItemsSource="{Binding MenuItems}">
            <controlsInputToolkit:ContextMenu.ItemContainerStyle>
                <Style TargetType="controlsInputToolkit:MenuItem">
                    <Setter Property="Header" Value="{Binding Name}"/>
                </Style>
            </controlsInputToolkit:ContextMenu.ItemContainerStyle>
        </controlsInputToolkit:ContextMenu>
    </controlsInputToolkit:ContextMenuService.ContextMenu>
</Button>

しかし、Silverlightはそれを好まないようです

何か案は?

4

3 に答える 3

0

代わりに、このオープンソースメニューを使用してみてください。

http://sl4popupmenu.codeplex.com

テンプレートを使用すると、画像を直接バインドできます。お役に立てれば。

于 2010-11-05T08:52:44.873 に答える
0

プログラムでコンテキスト メニューを作成し、コンテンツを MenuItem.Header プロパティに設定すると、画像に対して問題なく動作するようです。テキストを設定するたくさんあります。

于 2010-10-29T03:19:54.310 に答える
0

同じ質問がありましたが、必要な答えは見つかりませんでしたが、ニーズに合った回避策を見つけました. これほど後になっても、あなたはそれを見たいと思うかもしれません。

クラスItemsSourceのにオブジェクトが含まれている場合、アイコンはそれが属する場所に適切に配置されるようです。あなたと同じように、私はビュー モデルを使用していましたが、ビュー モデル クラスに UI ロジックを挿入する方法を知りませんでした。ContextMenuMenuItem

MenuItem代わりに、値コンバーターを実装して、ビュー モデルをオブジェクトに変換しました。それは次のように少し見えました:


XAML:

<UserControl.Resources>
    <local:DelegatedValueConverter
        x:Key="LocalContextItemConverter"
        Converting="OnBindingContextMenu" />
</UserControl.Resources>

...

<toolkit:ContextMenu
    ItemsSource="{Binding ContextMenuItems, Converter={StaticResource LocalContextItemConverter}}" />

C# コード ビハインド

private void OnBindingContextMenu(object sender, ValueConvertingEventArgs e)
{
    var dataitems = e.Value as IEnumerable< NavigationItemViewModel >;
    if (dataitems != null)
    {
        var items = dataitems.Select(data => new MenuItem()
        {
            Header = data.Title,
            Icon = data.Icon,
            Tag = data
        }).ToList();
        var handler = new RoutedEventHandler(this.OnContextMenuClick);
        items.ForEach(item => item.Click += handler);
        e.Result = items
    }
}

private void OnContextMenuClick(object sender, RoutedEventArgs e)
{
}

討論

ここDelegatedValueConverterで詳しく説明しますが、それほど重要ではありません。独自の値コンバーターをロールして、代わりに使用できます。

ビュー モデルのTitleプロパティは文字列で、IconのインスタンスですImage。メニュー項目のプロパティを使用Tagしてビュー モデルへの参照を保持し、クリック イベント中に非ビジュアル データを参照できるようにします。

このソリューションは、UI とビュー モデルの間にある程度の分離を提供するので便利ですが、この場合は純粋に宣言型のソリューションをお勧めします。

これが役立つことを願っています!

于 2011-03-05T16:11:40.763 に答える