我已经做了很多winform和很多WPF(MVC风格)。
我已经研究过MVVM模式,现在,我唯一坚持的是Commands
。
我得到的问题是我找不到足够的方法来为许多事件抛出命令。
我找不到如何在Business上下文中调用命令,即交互。
E.g。 : 我有以下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>
如果有人点击TextBox中的 Enter 键,我应该怎么做(我的意思是,在充分利用MVVM模式的情况下)执行命令?我的意思是,通常我会在“TextChanged”上设置一个事件并在后面的代码中发送命令。但是我不想把我的代码留空,不知道模型/业务逻辑。
这是我最简单的例子,但我可以对其他操作有同样的需求(使用简单按钮可能无法访问的操作)。
谢谢
答案 0 :(得分:1)
对于您的具体示例,您可以使用InputBindings
。这些允许您执行一些命令以响应手势(通常是键盘或鼠标)。这是一个快速实例,可以实现您的目标:
<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 Interactivity命名空间(请参阅here):
<TextBox>
<i:Interaction.Triggers>
<i:EventTrigger EventName="GotFocus">
<i:EventTrigger.Actions>
<i:InvokeCommandAction Command="{Binding SendMessageCommand}" />
</i:EventTrigger.Actions>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
可以在NuGet here上找到Blend SDK的非官方版本。