绑定Loaded事件?
我试图在 MainWindow 加载后显示登录窗口,同时坚持 MVVM 模式。所以我试图将我的主窗口 Loaded 事件绑定到我的视图模型中的事件。 这是我尝试过的:
MainWindowView.xaml
<Window x:Class="ScrumManagementClient.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
DataContext="ViewModel.MainWindowViewModel"
Loaded="{Binding ShowLogInWindow}">
<Grid>
</Grid>
</Window>
MainWindowViewModel.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ScrumManagementClient.ViewModel
{
class MainWindowViewModel : ViewModelBase
{
public void ShowLogInWindow(object sender, EventArgs e)
{
int i = 0;
}
}
}
我收到的错误消息是“Loaded=”{Binding ShowLogInWindow}”无效。“{Binding ShowLogInWindow}”不是有效的事件处理程序方法名称。仅实例生成的或代码隐藏类上的方法是有效的。”
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您将必须使用 System.Windows.Interactivity dll。
然后在 XAML 中添加命名空间:
然后您可以执行以下操作:
请注意,您必须使用
ICommand
(如果您使用 Prism,则必须使用 DelegateCommand;如果您使用 MVVMLight,则必须使用 RelayCommand),并且您的窗口的 DataContext 必须保存该 ICommand。You're going to have to use the System.Windows.Interactivity dll.
Then add the namespace in your XAML:
Then you can do stuff like:
Please note that you will have to use an
ICommand
(or DelegateCommand is you use Prism, or RelayCommand if you use MVVMLight), and the DataContext of your Window must hold that ICommand.使用附加行为。这在 MVVM 中是允许的......
(下面的代码可能/可能不会像那样编译)
XAML ...
代码隐藏...
附加行为...
DelegateCommand
源代码可以在互联网上找到...它是最适合 MVVM 的 ICommand API。编辑:19.07.2016 修复了两个小语法错误
Use Attached Behavior. That is allowed in MVVM ....
(code below may / may not compile just like that)
XAML ...
Code Behind...
And the attached behavior...
DelegateCommand
source code can be found on the internet... Its the most suited ICommand API available for MVVM.edit:19.07.2016 two minor syntax errors fixed
更新:
我发表了一篇关于方法绑定的新的更灵活版本的文章,该版本使用稍微不同的语法:
http://www.singulink.com/CodeIndex/post/updated-ultimate-wpf-event-method-binding
完整代码列表可用此处:
https://gist.github.com/mikernet/7eb18408ffbcc149f1d9b89d9483fc19
任何未来的更新都会发布到博客所以我建议检查那里最新版本。
原始答案:
.NET 4.5+ 现在支持事件的标记扩展。我用它来创建一个可以像这样使用的方法绑定:
查看模型方法签名:
可以在此处找到更多详细信息:http://www.singulink.com/CodeIndex/post/building-the-ultimate-wpf-event-method-binding-extension
的完整的类代码可以在这里找到:
https://gist.github.com/mikernet/4336eaa8ad71cb0f2e35d65ac8e8e161
Update:
I made a post about a new more flexible version of the method binding that uses a slightly different syntax here:
http://www.singulink.com/CodeIndex/post/updated-ultimate-wpf-event-method-binding
The full code listing is available here:
https://gist.github.com/mikernet/7eb18408ffbcc149f1d9b89d9483fc19
Any future updates will be posted to the blog so I suggest checking there for the latest version.
Original Answer:
.NET 4.5+ supports markup extensions on events now. I used this to create a method binding that can be used like this:
View model method signatures:
More details can be found here: http://www.singulink.com/CodeIndex/post/building-the-ultimate-wpf-event-method-binding-extension
The full class code is available here:
https://gist.github.com/mikernet/4336eaa8ad71cb0f2e35d65ac8e8e161
AttachedCommandBehavior V2 aka ACB<提出了一种更通用的使用行为的方法< /a> 它甚至支持多个事件到命令的绑定,
这是一个非常基本的使用示例:
A more generic way using behaviors is proposed at AttachedCommandBehavior V2 aka ACB and it even supports multiple event-to-command bindings,
Here is a very basic example of use:
对于 VS 2013 Update 5,我无法解决“无法将类型为‘System.Reflection.RuntimeEventInfo’的对象转换为类型为‘System.Reflection.MethodInfo’的问题”。相反,我在“Core”目录中创建了一个简单的界面
。我的 viewModel 已经具有实现 ILoad 的 load() 函数。在我的 .xaml.cs 中,我通过 ILoad 调用 ViewModel load()。
除了 POCO ILoad 之外,xaml.cs 对 ViewModel 一无所知,ViewModel 对 xaml.cs 一无所知。 ml_loaded 事件映射到 ViewModel load()。
For VS 2013 Update 5 I wasn't able to get around "Unable to cast object of type 'System.Reflection.RuntimeEventInfo' to type 'System.Reflection.MethodInfo". Instead in a "Core" directory I made a simple interface
My viewModel already had the load() function implementing ILoad. In my .xaml.cs I call the ViewModel load() through ILoad.
The xaml.cs knows nothing about the ViewModel except the POCO ILoad, the ViewModel knows nothing about the xaml.cs. The ml_loaded event is mapped to ViewModel load().