wpf Interaction Triggers 绑定任意方法、任意Command

发布时间 2023-10-27 09:55:16作者: JohnnyLei

 framework版本引入命名空间

  通过在代码中引入System.Windows.Interactivity.dll,引入了这个dll后我们就能够使用这个里面的方法来将事件映射到ViewModel层了,我们来看看具体的使用步骤,第一步就是引入命名控件

 xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

另外还可以通过另外一种方式来引入命名空间 是一样的。

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

 

.net版本引入命名空间 

安装 Microsoft.Xaml.Behaviors.Wpf 包

 xmlns:i="http://schemas.microsoft.com/xaml/behaviors"

 

1、绑定任意方法

xaml设置:

xaml顶部:

      xmlns:i="http://schemas.microsoft.com/xaml/behaviors"

      prism:ViewModelLocator.AutoWireViewModel="True"

      xmlns:prism="http://prismlibrary.com/"

 xaml设置Interaction:

   <Grid  AllowDrop="True">
       <i:Interaction.Triggers>
           <i:EventTrigger EventName="Drop">
               <i:CallMethodAction  TargetObject="{Binding}"  MethodName="Grid_Drop" ></i:CallMethodAction>
           </i:EventTrigger>
       </i:Interaction.Triggers>
 </Grid>

 

 viewmodel设置方法,传递参数:

        public  void Grid_Drop(object sender, DragEventArgs e)
        {
            try
            {
                var res = e.Data.GetData(DataFormats.FileDrop);
                string[] fileNames = ((string[])res);
                if (fileNames == null || fileNames.Count() == 0)
                {
                    return;
                }
                foreach (string fileName in fileNames)
                {
                    if (!fileName.EndsWith("acd"))
                    {
                        continue;
                    }
                    if (!File.Exists(fileName))
                    {
                        return;
                    }

                    SetMainTabItemView(fileName);
                }
            }
            catch (System.Exception)
            {
            }
        }

 

2、绑定vm中任意 command

xaml顶部:

      xmlns:i="http://schemas.microsoft.com/xaml/behaviors"

      prism:ViewModelLocator.AutoWireViewModel="True"

      xmlns:prism="http://prismlibrary.com/"

 

xaml设置Interaction:

    <Grid  AllowDrop="True">
    
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Drop">
                <i:InvokeCommandAction Command="{Binding Grid_DropCommand}"  CommandParameter="{Binding}" ></i:InvokeCommandAction>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Grid>

viewmodel command设置:

  public ICommand Grid_DropCommand => new DelegateCommand<object>(ExecuteGrid_DropCommand);

  private void ExecuteGrid_DropCommand(object obj)
  {
      Debug.WriteLine(obj);
  }