首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >掌握iCommand设计模式

掌握iCommand设计模式
EN

Stack Overflow用户
提问于 2016-03-03 19:01:17
回答 1查看 35关注 0票数 0

试图学习WPF和我已经阅读/测试了一个教程。

这是我的场景:

wpf C#应用程序。我的主窗口上有一个UserControl。这个UserControl上有4个按钮。我的意图是将每个命令(单击)事件绑定到每个按钮。但是,我不想将每个按钮绑定到它自己的类,而是将这4个按钮的每个命令事件绑定到1个类。所以..。我想向CanExecute和Execute方法传递一个参数,并且我正在试图向这些方法传递一个枚举。所以..。到目前为止,我得到的是:

代码语言:javascript
复制
public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}

public bool CanExecute(object parameter)
{
    var commandChosen= parameter as TopMenuCommands;
    return true;
}

public void Execute(object parameter)
{
    var buttonChosen = parameter as MenuCommandObject;
    evMenuChange(buttonChosen);
}

public enum enTopMenuCommands
{
    Button1 = 0,
    Button1 = 1,
    Button1 = 2,
    Button1 = 3
}

但是我怎么把这个绑在我的主窗户上呢?

我承认我可能做得完全错误,但我仍然在学习。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-03 19:09:48

我的ICommand实现在构造函数中接受一个Action<object>Execute方法刚刚调用了Action

这样,每个命令的逻辑就从创建它的地方传入。

ICommand实现:

代码语言:javascript
复制
public class SimpleCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;

        private Action<object> _execute;
        private Func<bool> _canExecute;

        public SimpleCommand(Action<object> execute) : this(execute, null) { }

        public SimpleCommand(Action<object> execute, Func<bool> canExecute)
        {
            _execute = execute;
            _canExecute = canExecute;
        }

        public bool CanExecute(object param)
        {
            if (_canExecute != null)
            {
                return _canExecute.Invoke();
            }
            else
            {
                return true;
            }
        }

        public void Execute(object param)
        {
            _execute.Invoke(param);
        }

        protected void OnCanExecuteChanged()
        {
            CanExecuteChanged?.Invoke(this,EventArgs.Empty);
        }

        #region Common Commands
        private static SimpleCommand _notImplementedCommand;
        public static ICommand NotImplementedCommand
        {
            get
            {
                if (_notImplementedCommand == null)
                {
                    _notImplementedCommand = new SimpleCommand(o => { throw new NotImplementedException(); });
                }
                return _notImplementedCommand;
            }
        }
        #endregion
    }

使用示例:

代码语言:javascript
复制
using System;
using System.Data.Entity;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Windows.Input;
using SqlMetaQuery.Model;
using SqlMetaQuery.ViewModels.ScriptList;
using SqlMetaQuery.Windows.EditQuery;
using WpfLib;

namespace SqlMetaQuery.Windows.Main
{
    class MainWindowVm : WpfLib.ViewModel
    {
        public MainWindowVm()
        {
            if (!IsInDesignMode)
            {
                using (Context db = new Context())
                {
                    ScriptTree = new ScriptTreeVm(db.Tags
                        .Include(t => t.Scripts)
                        .OrderBy(t => t.Name));

                    CurrentUser = db.Users.Where(u => u.UserName == "Admin").AsNoTracking().FirstOrDefault();
                    MiscTag = db.Tags.Where(t => t.Name == "Misc").AsNoTracking().FirstOrDefault();

                }
            }
        }

        public ScriptTreeVm ScriptTree { get; }

        public Model.User CurrentUser { get; }

        private Model.Tag MiscTag { get; }

        private void SaveScript(Model.Script script)
        {
            using (var context = new Model.Context())
            {
                context.Scripts.Add(script);
                context.SaveChanges();
            }
        }

        #region Commands

        private ICommand _exitCommand;
        public ICommand ExitCommand
        {
            get
            {
                if (_exitCommand == null)
                {
                    _exitCommand = new SimpleCommand((arg) => WindowManager.CloseAll());
                }
                return _exitCommand;
            }
        }

        private ICommand _newScriptCommand;
        public ICommand NewScriptCommand
        {
            get
            {
                if (_newScriptCommand == null)
                {
                    _newScriptCommand = new SimpleCommand((arg) =>
                    {
                        var script = new Model.Script()
                        {
                            Title = "New Script",
                            Description = "A new script.",
                            Body = ""
                        };
                        script.Tags.Add(MiscTag);
                        var vm = new EditQueryWindowVm(script);
                        var result = WindowManager.DisplayDialogFor(vm);

                        // if (result.HasValue && result.Value)
                        //{
                        script.VersionCode = Guid.NewGuid();
                        script.CreatedBy = CurrentUser;
                        script.CreatedDate = DateTime.Now.ToUniversalTime();
                        SaveScript(script);
                        //}
                    });
                }
                return _newScriptCommand;
            }
        }


        #endregion
    }
}

XAML:

代码语言:javascript
复制
<Window x:Class="SqlMetaQuery.Windows.Main.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:controls="clr-namespace:SqlMetaQuery.Controls"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:local="clr-namespace:SqlMetaQuery.Windows.Main"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        Title="MainWindow"
        Width="800"
        Height="600"
        d:DataContext="{d:DesignInstance Type=local:MainWindowVm}"
        mc:Ignorable="d">
    <DockPanel>
        <Menu DockPanel.Dock="Top">
            <MenuItem Header="File">
                <MenuItem Command="{Binding Path=NewScriptCommand}" Header="New Script..." />
                <Separator />
                <MenuItem Command="{Binding Path=ExitCommand}" Header="Exit" />
            </MenuItem>
        </Menu>
        <Grid Margin="8">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="250" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <controls:ScriptTree Grid.Row="0"
                                 Grid.Column="0"
                                 DataContext="{Binding Path=ScriptTree}" />
            <GridSplitter Grid.Row="0"
                          Grid.Column="1"
                          Width="8"
                          VerticalAlignment="Stretch"
                          ResizeBehavior="PreviousAndNext" />
            <Grid Grid.Row="0" Grid.Column="2">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="8" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Border Grid.Row="0" Style="{StaticResource BorderStandard}">
                    <TextBlock Text="{Binding Path=ScriptTree.CurrentScript.Title}" />
                </Border>
                <Border Grid.Row="3" Style="{StaticResource BorderStandard}">
                    <TextBlock Text="{Binding Path=ScriptTree.CurrentScript.Body}" />
                </Border>
            </Grid>
        </Grid>
    </DockPanel>

</Window>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35780740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档