C# 如何从elementhost viewmodel触发winform按钮

C# 如何从elementhost viewmodel触发winform按钮,c#,wpf,winforms,C#,Wpf,Winforms,我有一个winform,它使用elementhost显示视图。在我的winform上,我有一个winform按钮,我想在单击视图上的按钮时隐藏它。有没有办法做到这一点?我只是想知道如何通过视图模型与winform交互 form.cs VModel.DisableBtn += new ViewModel.EventHandler(_viewmodel_DisableExitFormButton); void _viewmodel_DisableExitFormButton() { bt

我有一个winform,它使用elementhost显示视图。在我的winform上,我有一个winform按钮,我想在单击视图上的按钮时隐藏它。有没有办法做到这一点?我只是想知道如何通过视图模型与winform交互

form.cs

VModel.DisableBtn += new ViewModel.EventHandler(_viewmodel_DisableExitFormButton); 

void _viewmodel_DisableExitFormButton()
{
    btnExitForm.Enabled = false;
}
xaml


在Winfrom中,您可以注册到ViewModel的事件,当按下视图中的按钮时将播放该事件,然后在该事件发生时隐藏按钮

例如:

视图模型:

public delegate void SomeHandler();

public event SomeHandler YourEventName;
在winfrom中,注册到此事件:

YourViewModel.YourEventName+=new YourViewModel.SomeHandler(Event_YourEventName);

      void Event_YourEventName()
        {
            //HIDE YOUR BUTTON
        }
在视图中按下按钮时,按命令运行事件

希望这有帮助

编辑:

将其添加到视图模型中

   private void OnButtonClicked()
    {
        if (YourEventName!= null)
        {
            YourEventName();
        }
    }
在对该函数的命令调用中

private void DisableExitFormBtn()
{
    OnButtonClicked();
}

这将引发事件并运行winfrom中的函数。

您应该添加此代码以触发事件禁用btn

 private void DisableExitFormBtn()
    {
        if(DisableBtn!=null)
          {
            EventArgs e = new EventArgs();
            DisableBtn(this, e);
          }
        // need to disable form button here
    }
更改以下内容:

public delegate void EventHandler(); // Comment this line or remove it
public event EventHandler DisableBtn;
将此更改为:

void _viewmodel_DisableExitFormButton(object sender, EventArgs e)
{
    btnExitForm.Enabled = false;
}

我不认为你能做到这一点而不诉诸可怕的黑客手段。winforms中的几乎所有内容都需要进行可怕的黑客攻击。winforms不支持ViewModel的概念。无论如何,如果你希望得到相关的答案,请在这里发布一些代码。我想确定我理解了你的意图,你的视图(用wpf编写)作为Winfrom?@HodayaShalom中的ElementHost--是的,没错。@HighCore--我已经更新了我的帖子。
\U viewmodel
来自winforms端的哪里?你是对的,它不是null,但DisableBtn仍然为null。你能看看我提供的代码,告诉我我还缺少什么吗。我是否需要对viewmodel构造函数执行任何操作?在这一行VModel.DisableBtn+=new viewmodel.EventHandler(_viewmodel_DisableExitFormButton)发生了什么;当我遍历它时,一旦它到达该行,它就会转到属性VModel并实例化一个新的ViewModel。首先检查我所有的字段,然后在完成后,转到构造函数。一旦它转到下一行而没有单步执行,DisableBtn是否为null?我注意到,一旦它转到下一行,这一行上的DisableBtn VModel.DisableBtn+=new ViewModel.EventHandler(_ViewModel_DisableExitFormButton)不为null。但是,在方法private void DisableExitFormBtn()内的viewmodel中,它为null,正如上面的代码所示。当它到达OnButtonClicked时,事件名称为null。我想这是因为我使用的是“ViewModelLocator”。谢谢。你的建议奏效了。我遇到问题的原因是,我的winform中的viewmodel实例化了一个新的viewmodel,然后一旦加载了我的视图(xaml),它就会实例化另一个新的viewmodel。我只是想办法确保它们是一样的。
public delegate void EventHandler(); // Comment this line or remove it
public event EventHandler DisableBtn;
void _viewmodel_DisableExitFormButton(object sender, EventArgs e)
{
    btnExitForm.Enabled = false;
}