使用C#在WPF中工作我从视图MyView生成一个事件,我需要做的是在关联的视图模型类MyViewModel中处理它。
我使用caliburn.micro来解决,这是合成中的代码:
<UserControl x:Class="MyView"
xmlns:cal="http://www.caliburnproject.org"
DataContext="MyViewModelInstance"
cal:Message.Attach="[Event CancelEvent]=[Action CancelButton_Click_MyViewModelHandler($source,$eventArgs)]">
<Grid>
<Button Click="CancelButton_Click"> </Button>
</Grid>
</UserControl>
在后面的代码中我处理生成CancelEvent的click事件:
public partial class MyView : UserControl
{
public event EventHandler CancelEvent;
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
if(CancelEvent!=null)
{
CancelEvent(sender,e);
}
}
}
在MyViewModel类中我定义了函数
public void MyViewMOdelHandler(Object sender, EventArgs arg)
我需要做的是使用上面的代码处理MyViewModelInstance中的CancelEvent,因为没有人订阅CancelEvent(CancelEvent == null),因此不会调用MyViewModelInstance中的CancelEvent处理程序。
有人知道问题的解决方案吗? (校准不是强制性的)
提前致谢。
-Z -
答案 0 :(得分:1)
我认为解决方案很简单。在您看来:
<UserControl x:Class="MyView"
xmlns:cal="http://www.caliburnproject.org"
DataContext="YourViewModel"
<Grid>
<Button Click="CancelButton_Click" cal:Message.Attach="[Event Click]=[Action MyViewModelHandler($source,$eventArgs)]">> </Button>
</Grid>
可以删除后面的代码中的CancelButton_Click。 在您的viewmodel中:
public class YourViewModel : PropertyChangedBase
{
public void MyViewModelHandler(Object sender, EventArgs arg)
{
}
}
答案 1 :(得分:1)
您是否有任何理由没有直接附加按钮的点击事件?因为那是最简单的解决方案。
看看你的例子,看起来Message.Attach正在指定一个不存在的方法。
如果视图模型上的方法是
public void MyViewModelHandler(Object sender, EventArgs arg)
然后附加语法将是
cal:Message.Attach="[Event CancelEvent]=[Action MyViewModelHandler($source,$eventArgs)]"