假设我有4个按钮,我希望每个按钮都做不同的事情.我不想要一个大的switch语句,我根据按下的按钮做了不同的事情,我也不想为每个按钮点击一个单独的方法.命令模式是解决这个问题的好方法吗?
我目前正在使用Silverlight 4并遵循MVVM模式.我有登录框绑定到我的ViewModel,如下所示:
<PasswordBox Password="{Binding Path=Password, Mode=TwoWay}" />
Run Code Online (Sandbox Code Playgroud)
然后,我有一个绑定到Command的按钮,该按钮监听ViewModel的PropertyChanged事件,当其中一个数据绑定更新其数据时,它会检查是否有足够的数据来启用Login按钮.
但是,PropertyChanged事件仅在用户从其中一个控件更改焦点时触发,我希望每次按键都更新模型,以便尽快启用登录按钮.
data-binding silverlight mvvm command-pattern silverlight-4.0
在研究了gwt-dispatch和Google Wave I/O演示文稿(最佳实践)(这里是视频)之后,我想知道为什么官方GWT版本(2.0)不使用调度(即命令模式)来实现它的RPC调用.有人知道吗?
我试图了解如何使用命令.我读了很多关于命令的知识,我知道,大多数时候命令都是在MVVM模式中使用的.我也知道,有一个RoutedCommand类 - 通常用于在开发时节省时间.
但是 - 我想了解基础知识 - 而这正是问题所在.开始了:
在我的应用程序中,我定义了一个类'MyCommand':
public class MyCommand :ICommand
{
public void Execute(object parameter)
{
Console.WriteLine("Execute called!");
CanExecuteChanged(null, null);
}
public bool CanExecute(object parameter)
{
Console.WriteLine("CanExecute called!");
return true;
}
public event EventHandler CanExecuteChanged;
}
Run Code Online (Sandbox Code Playgroud)
好吧 - 为了获得静态访问,我决定创建一个类,仅适用于所有应用程序命令:
public static class AppCommands
{
private static ICommand anyCommand = new MyCommand();
public static ICommand AnyCommand
{
get { return anyCommand; }
}
}
Run Code Online (Sandbox Code Playgroud)
就快到了.现在我在MainWindow中放了两个按钮.其中一个是"绑定"到命令:
<StackPanel>
<Button Content="Button" Height="23" Name="button1" Width="75" Click="button1_Click" />
<Button Content="Button" Height="23" Name="button2" Width="75" …Run Code Online (Sandbox Code Playgroud) 假设我有一个多维数组作为类的一个成员和许多方法,它循环遍历数组的每个元素然后对它进行操作.代码可能如下所示:
public class Baz {
private Foo[][] fooArray = new Foo[100][100];
public Baz() {
for (int i = 0; i < fooArray.length; i++) {
for (int j = 0; j < fooArray[i].length; j++) {
// Initialize fooArray
}
}
}
public void method1() {
for (int i = 0; i < fooArray.length; i++) {
for (int j = 0; j < fooArray[i].length; j++) {
// Do something with fooArray[i][j]
}
}
}
public void method2() {
for (int i = …Run Code Online (Sandbox Code Playgroud) 我正在与IoC合作,更准确地说是与windsor一起工作,我对一件事情有点怀疑.现在我正在实现DDD命令层,所以对于每个命令,我有一个具体的类如下
public class CreateUserCommand : IDomainCommand{
/// implementation
}
Run Code Online (Sandbox Code Playgroud)
每个命令都有一个或多个处理程序,具有以下实现
public class CreateUserHandler : IDomainCommandHandler<CreateUserCommand>
{
public void Handle(CreateUserCommand command)
{
/// implementation
}
}
Run Code Online (Sandbox Code Playgroud)
我的Command Dispatcher出现问题.我目前正在使用以下表格
public class CommandDispatcher : ICommandDispatcher
{
private IWindsorContainer container;
public CommandDispatcher(IWindsorContainer container)
{
this.container = container;
}
public void Dispatch<T>(T command)
{
var commandHandler = container.Resolve<ICommandHandler<T>>();
commandHandler.Handle(command);
}
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢的是调度员对IoC容器的认识,但同样地,我不知道如何在我需要它时解决处理程序.Shell我在Dispatcher中注入一个处理程序工厂,并在运行时使用它来解析我的处理程序?
tl; dr:
我喜欢Command-pattern的小型,专注的类,SetProjectAsActiveCommand但我也是DDD让模型负责自己的核心业务功能的方法,比如调用Project::setAsActive().这两个想法可以一起工作,还是它们是互斥的架构?
/ tl;博士
我一直工作在一个项目中,我们已经使用了Command模式,它具有类,如过去的几个月里ProposeNewProjectCommand,SetProjectAsActiveCommand和AddCommentToProjectCommand,所有这一切都是由一个命令总线处理.这些课程往往相当小,专注,只做一件事.
最近我一直在阅读有关领域驱动设计(DDD)和我推测,这种方法更依赖于模型做自己的工作,所以上面的命令可能被替换Organisation::proposeNewProject(),Project::setAsActive()和Project::addComment().
在模型上使用这些方法意味着它们可以充当"聚合根" (例如,在上面的示例中,Project负责创建自己的注释).
虽然我非常喜欢让我的实体对其核心业务功能负有更多责任的想法,但我也担心我的模型可能变得非常非常大,有很多关于应用程序可以执行的各种操作的方法.
有没有办法让Command模式的小型,专注的类仍然使模型一流的公民负责他们的关键业务功能,如在DDD?还是解决潜在大型模型问题的方法?
或者,或者,我应该选择一种模式并专门使用它?
哈里森,提前感谢您提出的任何见解
PS.我从来没有真正研究过使用DDD的应用程序,所以如果这是一个非常天真的问题我会道歉.
在命令模式中:
为什么客户端参与者不应该与调用者参与者是同一个类?当客户端参与者和调用者参与者可以是同一个类时,是否有可能的场景?
我用谷歌搜索,但找不到我想要的东西.我有几个问题......
这是我的代码结构:
我的命令类:
public class BrowseCommand : ICommand
{
//Code here
}
Run Code Online (Sandbox Code Playgroud)
在ViewModel中:
public class ExampleViewModel
{
public ExampleViewModel()
{
BrowseCommand = new BrowseCommand();
}
public ICommand BrowseCommand
{
get;
private set;
}
//More Code...
}
Run Code Online (Sandbox Code Playgroud)
MainWindow.xaml.cs:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ExampleViewModel();
}
}
Run Code Online (Sandbox Code Playgroud)
MainWindow.xaml:
Window x:Class="Ship32RcParser.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" >
<Grid>
<Button Content="Browse" Command="{Binding BrowseCommand}"/>
<Button Content="Search" Command="{Binding I_NEED_HELP_HERE}" />
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
我知道我的浏览工作正常,因为MainWindow.xaml.cs有
DataContext = new ExampleViewModel(); …Run Code Online (Sandbox Code Playgroud) 我试图在 VS2012 (Window 7) 中运行问题“ Understanding ICommandimplementation without MVVM ”中的代码,但出现错误:“WindowsPresentationFoundation(WPF)项目中不支持AppCommand”
好吧,出了什么问题或者我应该做什么才能运行该问题的代码?
MainWindow.xaml.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace seWPFUnderstandingICommandWithout_MVVM
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
AppCommands.AnyCommand.CanExecuteChanged += MyEventHandler;
}
private void button1_Click(object sender, RoutedEventArgs e)
{
// Nothing for the moment
}
private void MyEventHandler(object sender, EventArgs e)
{
Console.WriteLine("MyEventHandler called");
}
} …Run Code Online (Sandbox Code Playgroud) 我试图在用户按下某个键时执行命令:
<TextBox Command="{Binding myCommand}" Height="200" Width="200" FontSize="20"></TextBox>
Run Code Online (Sandbox Code Playgroud)
现在使用UWP我不完全确定如何实现.在WPF中我们有键绑定但是在这里?如果可能,没有第三方库.你们怎么解决这个问题?我不喜欢重新发明轮子并创建我自己的命令实现,适用于像这样的边缘情况.
command-pattern ×12
mvvm ×5
c# ×4
wpf ×3
button ×1
data-binding ×1
gwt ×1
gwt-dispatch ×1
icommand ×1
java ×1
loops ×1
menu ×1
refactoring ×1
silverlight ×1
uwp ×1