|
分類:[.NET 全般]
Frameworkを3.5から4.6へと移行中です。
そこでBlendのSystem.Windows.Interactivit.dllも4.5へと更新したのですが
コマンドバインドについて質問させてください。
下記コードのXMALの場合に@で動くことを想定していたのですが、NullReferenceExceptionが発生しました。
原因をトレースしたのですが、つかみきれませんでした。
問題点がお分かりになる方がおられましたら、ご回答いただけませんでしょうか?
宜しくお願いします。
==== XAML ===
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cmd="Commandへの参照"
<TextBox>
<i:Interaction.Triggers>
<i:EventName="TextChanged">
<i:InvokeCommandAction Command="{Binding AbcCommand}" CommandParameter="param" /> @ NullReferenceExceptionが発生
<cmd:EventToCommand Command="{Binding AbcCommand}" CommandParameter="param" /> A コマンドが実行される
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
==== Command ===
public class OriginCommand : TriggerAction<FrameworkElement>
{
#region 依存プロパティ
public static readonly DependencyProperty CommandProperty =
DependencyProperty.Register("Command", typeof(ICommand), typeof(OriginCommand ), new UIPropertyMetadata(null));
/// <summary>
/// コマンド
/// </summary>
public ICommand Command
{
get { return (ICommand)GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
public static readonly DependencyProperty CommandParameterProperty =
DependencyProperty.Register("CommandParameter", typeof(object), typeof(OriginCommand ), new UIPropertyMetadata(null));
/// <summary>
/// コマンドパラメータ
/// </summary>
public object CommandParameter
{
get { return (object)GetValue(CommandParameterProperty); }
set { SetValue(CommandParameterProperty, value); }
}
#endregion
protected override void Invoke(object parameter)
{
if (Command == null) return;
if (Command is RoutedCommand)
{
var rc = Command as RoutedCommand;
if (rc.CanExecute(CommandParameter, base.AssociatedObject))
{
rc.Execute(CommandParameter, base.AssociatedObject);
}
}
else
{
if (Command.CanExecute(CommandParameter))
Command.Execute(CommandParameter);
}
}
}
=== ViewModel ===
public OriginViewModel : ViewModelBase
{
private ICommand _abcCommand;
/// <summary>
/// コマンド
/// </summary>
public ICommand AbcCommand
{
get
{
return this._abcCommand
?? (this._abcCommand= new RelayCommand<object>(param => AbcFunc(param)));
}
}
}
|