在WPF中从View到ViewModel触发事件

时间:2014-05-28 17:48:54

标签: c# wpf caliburn.micro

使用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 -

2 个答案:

答案 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)]"