好吧,我看到您已经知道答案了...无论如何...您做错了什么,您一直在将事件绑定到 XAML 中的命令,而您没有命令:) 基本上,您将标准的“代码隐藏方法”搞砸了让我们说“MVVM 方法”/绑定。
因此,当您触摸代码隐藏并在DoSomethingEventHandler
那里创建您的代码时,您可以简单地
<UserControl .. Loaded="UserControl_Loaded">
..
</UserControl>
使用您的 CodeBehind:
private void UserControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
// Do Something
}
没关系...但它不是 MVVM :]
好吧,对于你的新方法(没有代码隐藏/让我们说 MVVM)......
如果您使用 Prism v4.1,您可以在此处查看大多数人在 Prism 中错过的此功能 :) 但提到了解决方案 :)
好吧,你知道你需要ICommand
你绑定到......它不一定是DelegateCommand
你可以使用你想要的......(我更喜欢并使用RelayCommand
)
好吧,但是我们从上述链接中学到了什么?
- 有时...不是这次...
ICommand
可以更改控件启用状态,并且当您不使用时它不会更新,Prism's Interactivity
而您只需使用Blend SDK's Interactivity
...您这次不需要它...我承认...但也许有一天:)
- 而且你不需要处理程序中的那些愚蠢的参数,因为你无论如何都没有得到它们:D(当你需要那些 Args 时,你可以使用 MVVM Light 例如。)
所以你能做的最好的就是:
<UserControl
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:prism="clr-namespace:Microsoft.Practices.Prism.Interactivity;assembly=Microsoft.Practices.Prism.Interactivity"
...
>
...
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<prism:InvokeCommandAction Command="{Binding MyCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
和你的 ViewModel 例如:
public ICommand MyCommand
{
get
{
return new RelayCommand(this.MyCommandExecute);
}
}
private void MyCommandExecute()
{
// DO Something...
}
抱歉,我没有回答已经回答的问题,但我想我可能会添加一些有趣的信息:)