【问题标题】:How to attach Command to wpf RibbonMenuButton?如何将命令附加到 wpf RibbonMenuButton?
【发布时间】:2010-11-14 15:24:36
【问题描述】:

我想知道如何将命令附加到 RibbonMenuButton 项。 以下是我最初的尝试,但从未调用过该命令。

<ribbon:RibbonWindow x:Class="RibbonMenuDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
        Title="MainWindow"
        x:Name="RibbonWindow"
        Width="640" Height="480">

    <Grid x:Name="LayoutRoot">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <ribbon:Ribbon x:Name="Ribbon">

            <ribbon:RibbonTab x:Name="HomeTab" 
                              Header="Home">
                <ribbon:RibbonGroup x:Name="Group1" 
                                    Header="Map">
                    <ribbon:RibbonMenuButton   ItemsSource="{Binding Regions}" 
                                         LargeImageSource="Images\LargeIcon.png" 
                                         Label="Regions"   >
                        <ribbon:RibbonMenuButton.ItemContainerStyle >
                            <Style TargetType="MenuItem" >
                                <Setter Property="Command" Value="{Binding RegionChangeCommand}" />
                                <Setter Property="CommandParameter" Value="{Binding Label}"></Setter>
                            </Style>
                        </ribbon:RibbonMenuButton.ItemContainerStyle>
                    </ribbon:RibbonMenuButton>
                </ribbon:RibbonGroup>

            </ribbon:RibbonTab>
        </ribbon:Ribbon> 
    </Grid>
</ribbon:RibbonWindow>

这是我的代码

using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Windows.Controls.Ribbon;
using System.ComponentModel;
using System.Diagnostics;

namespace RibbonMenuDemo
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : RibbonWindow
    {
        RelayCommand regionChangeCommand;


        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new Map();
        }

        public RelayCommand RegionChangeCommand
        {
            get 
            {
                if (regionChangeCommand == null)
                    regionChangeCommand = new RelayCommand(param => OnRegionChange(param), param =>  false);

                return regionChangeCommand; 
            }
        } 
        private void OnRegionChange(object param)
        {
            var val = (string)param;
            MessageBox.Show(val);
        }
    }

    public class Map
    {
        public Map()
        {
            Regions = new List<string> 
            { 
                "EAST", "North", "West", "South" 
            };
        }
        public List<string> Regions
        {
            get;
            set;
        }
    }

    public class RelayCommand : ICommand
    {
        readonly Action<object> execute;
        readonly Predicate<object> canExecute;

        /// <summary>
        /// create new simple command
        /// </summary>
        /// <param name="execute">execute handler</param>
        /// <param name="canExecute">predicate to determin if can excute</param>
        public RelayCommand(Action<object> execute, Predicate<object> canExecute = null)
        {
            if (execute == null)
                throw new ArgumentNullException("execute handler required");

            this.execute = execute;
            Predicate<object> v = (x) => { return true; };
            this.canExecute = canExecute ?? v;
        }

        public void Execute(object parameter)
        {
            this.execute(parameter);
        }
        [DebuggerStepThrough]
        public bool CanExecute(object parameter)
        {
            return canExecute(parameter);
        }
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
    }
}

【问题讨论】:

    标签: wpf wpftoolkit ribboncontrolslibrary


    【解决方案1】:

    这样解决:

    <ribbon:RibbonMenuButton DataContext="{Binding .}" ItemsSource="{Binding Regions}" 
        LargeImageSource="Images\LargeIcon.png" Label="Regions">
        <ribbon:RibbonMenuButton.ItemContainerStyle>
            <Style TargetType="MenuItem">
                <Setter Property="Command" Value="{Binding DataContext.RegionChangeCommand,
                    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type 
                    ribbon:RibbonMenuButton}}}" />
                <Setter Property="CommandParameter" Value="{Binding Label}"></Setter>
            </Style>
        </ribbon:RibbonMenuButton.ItemContainerStyle>
    </ribbon:RibbonMenuButton>
    

    改编自 MSDN 上 Visual Studio 论坛上的 Click event routing on RibbonButton under RibbonMenuButton? 页面。

    【讨论】:

    猜你喜欢
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 2012-07-28
    • 2014-05-03
    • 2015-11-09
    • 1970-01-01
    • 2012-10-05
    相关资源
    最近更新 更多