我正在开发一个非常简单的应用程序,一个带有几个按钮的视图。我想可以在视图模型中使用按钮的click事件。
但是我仅找到需要使用blend中的Interactivity.dll的示例,或者我必须实现ICommand接口或其他解决方案。
我想知道现在是否有任何解决方案不需要实现ICommand或使用诸如MVVM Light之类的框架。我想使用最简单的解决方案。
谢谢。
答案 0 :(得分:0)
为什么要避免使用ICommand?
您可以编写自己的ICommand实现,但是当MVVM Light具有所有工具且易于使用时,则不需要此操作。
如果您的应用是如此简单,则您可以选择:
忽略MVVM模式,仅在后面的代码中实现事件处理程序
(我建议)将MVVM Light与默认的ICommand实现一起使用
public RelayCommand ExampleRelayCommand =>新的RelayCommand(ExampleMethod);
private void ExampleMethod()
{
}
如果需要EventArgs,则可以使用PassEventArgsToCommand =“ True”以及MVVM Light来实现交互触发器和EventToCommand
public RelayCommand<RoutedEventArgs> EventRelayCommand => new RelayCommand<RoutedEventArgs>(EventRelayCommandMethod);
private void EventRelayCommandMethod(RoutedEventArgs e)
{
}
然后,在XAML中的按钮内:
<Button Grid.Column="0" Content="Example">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<command:EventToCommand Command="{Binding EventRelayCommand}" PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
答案 1 :(得分:0)
您为什么不喜欢使用ICommand
?如果您要遵循MVVM
模式,那么这是在UI和业务逻辑层之间实现分离的完美方法。
ICommand的最基本实现就是这样
/// <summary>
/// a very simple ICommand implementation
/// </summary>
public class BasicCommand: ICommand
{
private readonly Action _execute;
public BasicCommand(Action execute)
{
_execute = execute;
}
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
_execute?.Invoke();
}
public event EventHandler CanExecuteChanged;
}
ICommand
的更高级实现(例如MVVM-Light RelayCommand
)还需要通过CanExecute机制来禁用任何绑定控件(例如按钮或菜单项),而这种耦合的方式更加分离和清洁而不是尝试设置Button.InEnabled。
答案 2 :(得分:0)
您可能想看看Caliburn.Micro。这是一个MVVM库,可让您定义视图模型中没有任何命令的方法,并使用命名约定将它们绑定到它们:
查看模型:
public void Click() { /* handle */ }
查看:
<Button Content="Click!" x:Name="Click" />
另一种选择是将click事件处理程序添加到视图的代码隐藏类中,然后从那里调用视图模型的方法:
private void Button_Click(object sender, RoutedEventArgs e)
=> (DataContext as GeneralOptionsViewModel).Click();
然后,您不使用任何命令,但仍将应用程序逻辑保留在视图模型中。