WPF MVVM UserControl 的 i:Interaction.Triggers 应用

本例依赖文章 https://blog.csdn.net/Vblegend_2013/article/details/81634020

用户控件代码

        /// <summary>
        /// 声明路由事件
        /// 参数:要注册的路由事件名称,路由事件的路由策略,事件处理程序的委托类型(可自定义),路由事件的所有者类类型
        /// </summary>
        public static readonly RoutedEvent OnToolTipShowEvent = EventManager.RegisterRoutedEvent("OnToolTipShow", RoutingStrategy.Bubble, typeof(MyEventArgs), typeof(MyUserControl));
        /// <summary>
        /// 处理各种路由事件的方法 
        /// </summary>
        public event RoutedEventHandler OnToolTipShow
        {
            //将路由事件添加路由事件处理程序
            add { AddHandler(OnToolTipShowEvent, value,false); }
            //从路由事件处理程序中移除路由事件
            remove { RemoveHandler(OnToolTipShowEvent, value); }
        }

 MyEventArgs 必须继承 RoutedEventArgs

    public class MyEventArgs: RoutedEventArgs
    {
        ...你的事件参数
    }

用户控件中触发事件

            var param = new MyEventArgs();
            param.RoutedEvent = OnToolTipShowEvent;
            param.Source = this;
            this.RaiseEvent(param);

 

WPF绑定

<MyUserControl>
    <i:Interaction.Triggers>
                    <i:EventTrigger EventName="OnToolTipShow">
                        <cmd:EventCommand Command="{Binding OnToolTipShow}"/>
                    </i:EventTrigger>
    </i:Interaction.Triggers>
</MyUserControl>

MVVM

        public IDefaultCommand OnToolTipShow
        {
            get
            {
                return new CallCommand<MyEventArgs>((s, e) =>
                {

                }, (s, o) => { return true; });
            }
        }

 

 

WPF MVVM模式中,`ICommand` 和 `Binding` 的结合通常用于管理用户界面的行为,而`I:Interaction.Triggers` 则是在ViewModel和View之间的交互层提供了一些预定义的事件绑定。如果在一个地方设置了全局的`Interaction.Triggers`,导致所有控件都响应相同的Trigger,这可能会造成不必要的全局影响。 为了避免这种情况,你可以采取以下策略: 1. **局部化Triggers**:将`Interaction.Trigger`绑定到具体的视图模型属性上,而不是直接关联到UI元素。这样只会影响该特定区域的控件。 ```xml <Button> <i:Interaction.Triggers> <i:EventTrigger EventName="Click"> <local:MyCustomCommand.Execute /> </i:EventTrigger> </i:Interaction.Triggers> </Button> // ViewModel中,MyCustomCommand是个实例化的命令 public ICommand MyCustomCommand { get; set; } ``` 2. **使用依赖项注入(DI)**:如果你使用的是MVVM库如Prism、Caliburn.Micro等,它们通常支持服务注册和注入。在这种情况下,可以在需要的地方注入自定义的`InteractionService`,控制触发的范围。 3. **分离视图与行为**:对于更复杂的场景,可以创建单独的行为管理类或行为字典,在需要的时候从这里获取和设置对应的命令,而不是直接在视图层次结构中操作。 4. **利用 RelayCommand** 或者其他封装过的命令类:例如,可以创建一个带有`Region`属性的`RelayCommand`,仅在某个特定的`Region`内的控件上生效。 通过上述方法,你可以更好地控制`Interaction.Triggers`的行为,使其针对每个UI区域独立工作。同时,遵守DRY (Don't Repeat Yourself)原则,提高代码的组织性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值