zoukankan      html  css  js  c++  java
  • 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;//使用

      }

  • 相关阅读:
    [MongoDB]
    [solr]
    数据结构-二叉树
    vue-学习笔记-Class 与 Style 绑定
    vue-学习笔记-计算属性和侦听器(computed和watch)
    lodash的debounce函数
    vue-学习笔记-模板语法
    vue-学习笔记-Vue 实例
    vue-介绍章节
    工具网站推荐-jsfiddle,一款在线写代码的网站
  • 原文地址:https://www.cnblogs.com/ouylvr0625/p/6962575.html
Copyright © 2011-2022 走看看