Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVVM模式:用于几个GUI事件的命令?_C#_Wpf_Xaml_Mvvm_Command Pattern - Fatal编程技术网

C# MVVM模式:用于几个GUI事件的命令?

C# MVVM模式:用于几个GUI事件的命令?,c#,wpf,xaml,mvvm,command-pattern,C#,Wpf,Xaml,Mvvm,Command Pattern,我已经做了很多winform和很多WPF(MVC风格) 我已经研究了MVVM模式,现在,我唯一坚持的是命令 我遇到的问题是,我没有找到一个足够的方法为许多事件抛出命令 我找不到如何调用命令,即在业务上下文上的交互 例如: 我有以下MVVM模型: public class MyDemoViewModel : DependencyObject{ private IDataManager _manager; private static readonly DependencyPrope

我已经做了很多winform和很多WPF(MVC风格)

我已经研究了MVVM模式,现在,我唯一坚持的是
命令

我遇到的问题是,我没有找到一个足够的方法为许多事件抛出命令

我找不到如何调用命令,即在业务上下文上的交互

例如: 我有以下MVVM模型:

public class MyDemoViewModel : DependencyObject{
    private IDataManager _manager;
    private static readonly DependencyProperty _currentMessageDependancyProperty = DependencyProperty.Register("CurrentMessage", typeof(String), typeof(MyDemoViewModel), new PropertyMetadata(""));

    public ICommand SendMessageCommand{get; private set;}
    public String CurrentMessage {
            get { return(String) GetValue(_currentMessageDependancyProperty); }
            set { SetValue(_currentMessageDependancyProperty, value); }
        }

    public MyDemoViewModel(IDataManager manager){
        _manager= manager;
        SendMessageCommand = new SendMessageCommand(this);
    }

    public void SendMessage(String message){
        _manager.SendMessage(message);
        CurrentMessage = String.Empty;
    }
}
使用一个简单的命令:

public class SendMessageCommand :ICommand{
    private MyDemoViewModel _model;

    public SendMessageCommand(MyDemoViewModel model) {
        _model = model;
    }

    public event EventHandler CanExecuteChanged {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public bool CanExecute(object parameter)
    {
        return !String.IsNullOrEmpty(_model.CurrentMessage);
    }

    public void Execute(object parameter)
    {
        _model.SendMessage( _model.CurrentMessage );
    }
}
以及基本的XAML:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <TextBox Grid.Row="1" TextWrapping="Wrap" Text="{Binding CurrentMessage, UpdateSourceTrigger=PropertyChanged}"/>
    <Button Content="Send" Grid.Column="1"  Grid.Row="1" Command="{Binding SendMessageCommand}"/>
</Grid>

当有人点击文本框中的Enter键时,我应该怎么做(我的意思是,在MVVM模式的等式中),让我的命令执行?我的意思是,通常我会在“TextChanged”上设置一个事件,然后在代码中发送命令。但我不想让我的代码保持空白,不了解任何模型/业务逻辑

这是我见过的最简单的例子,但我对其他操作也有同样的需求(使用简单的按钮可能无法访问的操作)


感谢您

对于您的具体示例,您可以使用
输入绑定
。这些允许您对手势(通常是键盘或鼠标)执行一些命令。下面是一个实现您所追求目标的快速示例:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <TextBox Grid.Row="1" TextWrapping="Wrap" Text="{Binding CurrentMessage, UpdateSourceTrigger=PropertyChanged}">
        <TextBox.InputBindings>
            <KeyBinding Command="{Binding SendMessageCommand}" Key="Return" />
            <KeyBinding Command="{Binding SendMessageCommand}" Key="Enter" />
        </TextBox.InputBindings>
    </TextBox>
    <Button Content="Send" Grid.Column="1"  Grid.Row="1" Command="{Binding SendMessageCommand}"/>
</Grid>

对于更高级的情况,例如响应各种UI事件,可以使用Expression Blends交互性命名空间(请参阅):



可以在NuGet上找到Blend SDK的非官方版本。

对于您的特定示例,您可以使用
输入绑定。这些允许您对手势(通常是键盘或鼠标)执行一些命令。下面是一个实现您所追求目标的快速示例:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <TextBox Grid.Row="1" TextWrapping="Wrap" Text="{Binding CurrentMessage, UpdateSourceTrigger=PropertyChanged}">
        <TextBox.InputBindings>
            <KeyBinding Command="{Binding SendMessageCommand}" Key="Return" />
            <KeyBinding Command="{Binding SendMessageCommand}" Key="Enter" />
        </TextBox.InputBindings>
    </TextBox>
    <Button Content="Send" Grid.Column="1"  Grid.Row="1" Command="{Binding SendMessageCommand}"/>
</Grid>

对于更高级的情况,例如响应各种UI事件,可以使用Expression Blends交互性命名空间(请参阅):



在NuGet上可以找到Blend SDK的非官方版本。

哦,非常好!ListBox是否为SelectedItem事件提供了此类InputBinding?要对事件做出反应,您可能需要使用混合交互功能,使用
,然后执行相应的命令。另一种方法是将
ListBox
SelectedItem
绑定到视图模型中的属性,如果选择了某个属性,则可以执行某些操作。是否建议“注册/侦听”我的模型的依赖属性?通常视图模型实现了INotifyPropertyChanged
,而不是派生自
DependencyObject
,有关模型和视图模型所起作用的说明,请参见。哦,非常好!ListBox是否为SelectedItem事件提供了此类InputBinding?要对事件做出反应,您可能需要使用混合交互功能,使用
,然后执行相应的命令。另一种方法是将
ListBox
SelectedItem
绑定到视图模型中的属性,如果选择了某个属性,则可以执行某些操作,并且建议“注册/侦听”我的模型的依赖项属性吗?通常视图模型实现INotifyPropertyChanged,而不是从
DependencyObject
派生,有关模型和视图模型所起作用的说明,请参见。我通常使用。它允许您将命令绑定到UI中的几乎任何事件<如果你不介意使用混合库的话,代码>交互。触发器也是一个可行的选择。我通常使用一个来实现这种功能。它允许您将命令绑定到UI中的几乎任何事件<如果您不介意使用混合库,那么code>Interaction.Triggers也是一个可行的选择。