解決方案之一是使用WPF路由命令。
注:我寫了這個答案,假設你的「View」是Window類的一個子類。
首先,爲您的項目添加一個自定義路由命令。
public static class MyCommands
{
private static readonly RoutedUICommand exportCommand = new RoutedUICommand("description", "Export", typeof(MyCommands));
public static RoutedUICommand ExportCommand
{
get
{
return exportCommand;
}
}
}
在每個視圖,設置自定義命令Button.Command並結合目標對象Button.CommandTarget。
<Button Command="local:MyCommands.ExportCommand" CommandTarget="{Binding ElementName=dataGrid1}">Export</Button>
最後,在Application類(默認情況下命名爲App)中,在自定義命令和Window之間註冊命令綁定。
public partial class App : Application
{
public App()
{
var binding = new CommandBinding(MyCommands.ExportCommand, Export, CanExport);
CommandManager.RegisterClassCommandBinding(typeof(Window), binding);
}
private void Export(object sender, ExecutedRoutedEventArgs e)
{
// e.Source refers to the object is bound to Button.CommandTarget.
var dataGrid = (DataGrid)e.Source;
// Export data.
}
private void CanExport(object sender, CanExecuteRoutedEventArgs e)
{
// Assign true to e.CanExecute if your application can export data.
e.CanExecute = true;
}
}
現在,App.Export在用戶單擊按鈕時被調用。
樣品可用here。
這就是MVVM出現的地方......一個ViewModel適用於您的變化視圖,通過在ViewModel上定義並由View使用的DelegateCommand執行邏輯。 – 2011-01-13 18:02:52
NO。該邏輯不能位於View Model中。 MVVM的重點在於分離UI和邏輯。在這裏,UI控件實例是必需的,不應該傳遞給視圖模型。 – 2011-01-14 10:38:58