我个人会考虑使用 Expression Blend SDK InvokeCommandAction。
我敲了一个有效的例子。这是视图:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" x:Class="WpfApplication1.MainWindow"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel>
<TextBox Text="Hello World">
<i:Interaction.Triggers>
<i:EventTrigger EventName="TextChanged">
<i:InvokeCommandAction Command="{Binding DoItCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
<Button x:Name="CommandButton" Command="{Binding DoItCommand}" Content="Click me" />
</StackPanel>
</Grid>
</Window>
还有一个非常简单的 ViewModel(使用 PRISM 的DelegateCommand):
public class SomeViewModel
{
public SomeViewModel()
{
DoItCommand = new DelegateCommand(() => Debug.WriteLine("It Worked"));
}
public ICommand DoItCommand { get; private set; }
}
简单连接 ViewModel 背后的代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new SomeViewModel();
}
}
您也不需要 Expression Blend 来执行此操作 - SDK 可以免费下载和使用。
如果您不喜欢使用 Expression Blend SDK,MVVM Light提供了 EventToCommand,它与此类似。
当然,只有在仍有理由将按钮放置在适当位置(或者您希望利用命令的可执行逻辑)时,这样做才真正有意义,否则您可以在属性的 setter 中触发一些逻辑。