Caliburn.Micro アクションと非常によく似た動作をする小さなマークアップ拡張機能を作成しました。ビューモデルのメソッドを呼び出します。この例では、パラメーターのないメソッドのみがサポートされていますが、簡単に拡張できます。
使用法:
<Border.InputBindings>
<MouseBinding Command="{ns:CallViemodelMethod SomeMethod}" MouseAction="LeftClick" />
</Border.InputBindings>
モデルを見る:
public class SomeViewModel
{
publiv void SomeMethod()
{
// handle click
}
}
拡大:
public class CallViemodelMethod : MarkupExtension, ICommand
{
private readonly string _methodName;
private FrameworkElement _rootObject;
public CallViemodelMethod(string methodName)
{
_methodName = methodName;
}
public event EventHandler CanExecuteChanged;
public override object ProvideValue(IServiceProvider serviceProvider)
{
// get root of target page
var provideRoot = serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
_rootObject = provideRoot?.RootObject as FrameworkElement;
return this;
}
public bool CanExecute(object parameter) => true;
public void Execute(object parameter)
{
var dataContext = _rootObject?.DataContext;
if (dataContext == null) return;
var methodInfo = dataContext.GetType().GetMethod(_methodName);
if (methodInfo == null) return;
methodInfo.Invoke(dataContext, new object[0]);
}
}