B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【三】

播放地址:20241120-.NET9.0+WPF实战三类流程化业务逻辑控制-10_哔哩哔哩_bilibili

第7-9课时,简单实现通过NodeModel类及子类实现绑定式的拖拽

新增NodeModel.cs文件实现拖拽信息传递数据记录

1     public abstract class NodeModel
2     {
3         public abstract string Name { get; set; }
4         public abstract void Execute();
5     }

新增ProcessA.cs,ProcessA.cs,ProcessC.cs,ProcessD.cs文件

复制代码
 1     public class ProcessA : NodeModel
 2     {
 3         public override string Name { get; set; }="AAAA";
 4 
 5         public override void Execute()
 6         {
 7             Debug.WriteLine("正在执行ProcessA");
 8         }
 9     }
10     public class ProcessB : NodeModel
11     {
12         public override string Name { get; set; }="BBBB";
13 
14         public override void Execute()
15         {
16             Debug.WriteLine("正在执行ProcessB");
17         }
18     }
19     public class ProcessC : NodeModel
20     {
21         public override string Name { get; set; }="CCC";
22 
23         public override void Execute()
24         {
25             Debug.WriteLine("正在执行ProcessC");
26         }
27     }
28     public class ProcessD : NodeModel
29     {
30         public override string Name { get; set; }="DDDD";
31 
32         public override void Execute()
33         {
34             Debug.WriteLine("正在执行ProcessD");
35         }
36     }
ProcessA ProcessB ProcessC ProcessD文件内容
复制代码

为了实现双向绑定需要安装CommunityToolkit.Mvvm包 在Nuget上搜索communityToolkit,这里安装8.3.2

调整MainViewModel.cs文件中的内容最终代码如下

注意第五行引用,第九行设置类为partial 否则运行报错,26行特性属性主要用于前台点击按钮时调用触发

复制代码
 1 using System.Collections.ObjectModel;
 2 using System.Windows.Controls;
 3 using System.Windows.Input;
 4 using System.Windows;
 5 using CommunityToolkit.Mvvm.Input;
 6 
 7 namespace WpfApp2
 8 {
 9     public partial class MainViewModel
10     {
11         public ObservableCollection<NodeModel> ProcessList { get; set; } = new ObservableCollection<NodeModel>();
12 
13         public void ListViewItem_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
14         {
15             DragDrop.DoDragDrop((DependencyObject)sender, (sender as ListViewItem).Content, DragDropEffects.Copy);
16         }
17 
18         public void ListBox_Drop(object sender, DragEventArgs e)
19         {
20             string value = e.Data.GetData(typeof(string)).ToString();
21             ProcessList.Add(new ProcessA());
22             ProcessList.Add(new ProcessB());
23             ProcessList.Add(new ProcessC());
24             ProcessList.Add(new ProcessD());
25         }
26         [RelayCommand]
27         private void Execute()
28         {
29             foreach (var item in ProcessList)
30             {
31                 item.Execute();
32             }
33         }
34     }
35 }
复制代码

MainView.xaml文件代码

复制代码
<Window x:Class="WpfApp2.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2" xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
        mc:Ignorable="d"
        WindowStartupLocation="CenterScreen"
        Background="White"
        Title="MainView" Height="650" Width="1300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="200" />
            <ColumnDefinition Width="300" />
            <ColumnDefinition />           
        </Grid.ColumnDefinitions>
        <Button Content="执行" HorizontalAlignment="Stretch" Margin="3"  Command="{Binding ExecuteCommand}" />
        <ListView Grid.Row="1" Grid.Column="0">
            <ListViewItem Content="AAA">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="PreviewMouseLeftButtonDown">
                        <i:CallMethodAction MethodName="ListViewItem_MouseLeftButtonDown" TargetObject="{Binding}" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </ListViewItem>
            <ListViewItem Content="BBB"></ListViewItem>
            <ListViewItem Content="CCC"></ListViewItem>
            <ListViewItem Content="DDD"></ListViewItem>
        </ListView>
        <ListBox Grid.Row="1" Grid.Column="1" AllowDrop="True" ItemsSource="{Binding ProcessList}">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Drop">
                    <i:CallMethodAction MethodName="ListBox_Drop" TargetObject="{Binding}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </ListBox>
    </Grid>
</Window>
复制代码

本节主要演示增加了Button按钮,通过拖拽列表到右侧后,除了界面上增加了内容以后,点击执行按钮,可以通过调试输出窗口看到同时执行了内部的一些逻辑,后续代码复杂之后,可以通过这个逻辑执行解决复杂的问题
第9课主要讲解解释第7-8课代码实现的逻辑以及作用,承上启下告知后续会如何调整代码让使用逻辑更加灵活

 

posted @   uxinxin  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示