WPF MVVM 如何在ViewModel中操作View中的控件事件

原文: WPF MVVM 如何在ViewModel中操作View中的控件事件

(在学习Wpf的时候,做一个小例子,想在TextBox改变后,检验合法性,并弹出提示。在找了很多贴后,发现这个小例子,抄袭过来,仅供参考。

最后也找到了适合自己例子的办法:在出发TextChanged后,做出提示(提示可以根据要求来写),见最后。)

虽然说MVVM模式下不建议在Viewmodel层中操控View层中控件,但是在某些情况下,比如想要得到某个事件的参数,在Viewmodel层中不太方便实现,这时候就可以用下面的方法了。

在XAML中

1、引用组件并设置

xmlns:Interaction="http://schemas.microsoft.com/expression/2010/interactions"

xmlns:Interactivity="http://schemas.microsoft.com/expression/2010/interactivity"

2、DataContext设置

xmlns:VM="clr-namespace:MVVM_.ViewModel"

<Window.DataContext>        

<VM:MainWindowViewModel /> < /Window.DataContext>

3、事件触发,以窗口的大小改变事件为例  SizeChanged

<Interactivity:Interaction.Triggers>        

<Interactivity:EventTrigger EventName="SizeChanged">            

<Interaction:CallMethodAction TargetObject="{Binding}" MethodName="SizeChangedCommand"/>        

</Interactivity:EventTrigger>

< /Interactivity:Interaction.Triggers>

在Viewmodel中

public class MainWindowViewModel

 {public void SizeChangedCommand(object obj, SizeChangedEventArgs e){}}

最后找出一中合适我测试所需要的,具体如下:

1、xaml中添加引用:

xmlns:ie = "http://schemas.microsoft.com/expression/2010/interractivity"

2、TextBox 代码:

复制代码
<TextBox Text="{Binding xxx,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
<ie:Interaction.Triggers>
 <ie:EventTrigger EventName="TextChanged">
        <ie:InvokeCommandAction Command = "{Binding TextChangedCommand}" CommandParametes="xxxx" />
         </ie:EventTrigger >
</ie:Interaction.Triggers>
</TextBox>
复制代码

大致意思是用Action和Invoke之类的。

EventName="TextChanged"  是TextBox中的事件,可以更换成自己需要的事件。

3、在后定义委托...(请参照上一篇代码)

4、如果是传窗体(Window)或者按钮Button,用ElementName,如下:

  xaml代码:

<Button x:Name="btnSendButInfo" Width="100" Command="{Binding BtnClickCommand}"
CommandParameter="{Binding ElementName=btnSendButInfo}" />

  ViewModel:

  private DelegateCommand<Button> BtnClickCommand; //申明委托

  BtnClickCommand = new DelegateCommand<Button>(BtnClick); //实例化

  private void BtnClick(Button btn)

  {

    string strBtnName =  btn.Name;//使用

  }

猜你喜欢

转载自www.cnblogs.com/lonelyxmas/p/12771348.html