CallMethodAction的用法

        之前很长时间都在重复的敲着代码没有时间来学习技术充实自己,直到这个项目的代码已经乱到无法管理的时候,才想起来用MVVM的框架来构建系统。要使用MVVM,必然会涉及到前台控件中事件调用的问题,查了一些资料,大家都推荐的使用Icommand绑定到  控件的Command上。

        但是这样会出现一个问题,就是不是所有的控件都有Command属性,只有继承ButtonBase的控件才带有Command属性。而且UI元素一般有Load ,MouseLeftButtonDown等情况,再这样情况下Icommand就不足以满足当前的项目需求。在微软社区经过询问之后一位外国友人推荐使用Behavior。 Blend中一共提供了包括CallMehod等在内的十三种行为,基本满足所有的需求。如有特殊情况可以进行对Action的扩展。

        这篇文章是我用来记录我自己使用CallMethodAction的过程。首先看一下,微软对于CallMethodAction的解释: 您可以使用 CallMethodAction 操作来调用为指定对象定义的方法。所调用的方法必须是不采用参数并且不返回值的公共方法,或是其签名与事件处理程序的签名相匹配的公共方法。

        微软帮助地址 http://msdn.microsoft.com/zh-cn/library/ff723947(v=expression.40).aspx。

        顾名思义,CallMethodAction ,调用 方法的 “行为”。微软的解释中还有很重要的一点。 所调用的方法必须是不含参数的,并且不具备返回值的。

在Blend中行为里选择CallMethodAction将其拖拽到需要使用的控件之下。选中CallMethodAction。会发现几个属性。SourceName默认指向你拖拽到的控件。可以不绑定。EventName绑定到你需要调用该行为的事件之下,可以有Click,Load,MouseLeftButtonDown等等。MethodName( 可以手打)绑定到你的ViewModel中的需要调用的方法。 TargetObject一定要记住绑定。TargetObject绑定到 MethodName所在的地方,简单的说就是DataContext。MethodName的来源。

 public void MapSwitchToVMethod()
        {
            ArcGISTiledMapServiceLayer TLayer = MyMap.Layers[0] as ArcGISTiledMapServiceLayer;
            TLayer.Url = Application.Current.Resources["VectorLayer"].ToString();
        }

ViewModel中的方法,不含参数,不含返回值。



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于WPF MVVM实现ListBox拖动排序的代码示例: 首先,我们需要使用System.Windows.Interactivity和Microsoft.Expression.Interactions这两个NuGet包。 然后,在ListBox上添加以下命名空间: ```xml xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" ``` 接着,在ListBox上添加以下代码: ```xml <ListBox ItemsSource="{Binding Items}"> <i:Interaction.Triggers> <i:EventTrigger EventName="Loaded"> <ei:ChangePropertyAction PropertyName="AllowDrop" Value="True"/> </i:EventTrigger> <i:EventTrigger EventName="PreviewMouseLeftButtonDown"> <ei:CallMethodAction MethodName="PreviewMouseLeftButtonDown"/> </i:EventTrigger> <i:EventTrigger EventName="Drop"> <ei:CallMethodAction MethodName="Drop"/> </i:EventTrigger> </i:Interaction.Triggers> <ListBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Name}"/> </DataTemplate> </ListBox.ItemTemplate> </ListBox> ``` 在ViewModel中,我们需要实现以下几个方法: ```csharp public class MainViewModel { public ObservableCollection<Item> Items { get; set; } = new ObservableCollection<Item>(); private Item _draggedItem; private int _draggedIndex; public void PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { var listBoxItem = FindVisualParent<ListBoxItem>((DependencyObject)e.OriginalSource); if (listBoxItem == null) return; _draggedItem = (Item)listBoxItem.DataContext; _draggedIndex = Items.IndexOf(_draggedItem); DragDrop.DoDragDrop(listBoxItem, listBoxItem.DataContext, DragDropEffects.Move); } public void Drop(object sender, DragEventArgs e) { var listBoxItem = FindVisualParent<ListBoxItem>((DependencyObject)e.OriginalSource); if (listBoxItem == null) return; var targetItem = (Item)listBoxItem.DataContext; var targetIndex = Items.IndexOf(targetItem); Items.Move(_draggedIndex, targetIndex); _draggedItem = null; } private static T FindVisualParent<T>(DependencyObject child) where T : DependencyObject { while (true) { var parentObject = VisualTreeHelper.GetParent(child); if (parentObject == null) return null; if (parentObject is T parent) return parent; child = parentObject; } } } public class Item { public string Name { get; set; } } ``` 这里使用了一个辅助方法FindVisualParent,用于查找父级元素。PreviewMouseLeftButtonDown方法用于设置拖动项和拖动项的索引,Drop方法用于移动项,Items.Move方法会自动更新UI。 最后,我们需要在MainWindow中绑定ViewModel: ```xml <Window.DataContext> <local:MainViewModel/> </Window.DataContext> ``` 这样,我们就实现了ListBox拖动排序的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值