惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
S
SegmentFault 最新的问题
Engineering at Meta
Engineering at Meta
量子位
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Google DeepMind News
Google DeepMind News
博客园_首页
云风的 BLOG
云风的 BLOG
月光博客
月光博客
I
InfoQ
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Vercel News
Vercel News
美团技术团队
Microsoft Security Blog
Microsoft Security Blog
P
Proofpoint News Feed
D
Docker
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
博客园 - 叶小钗
Martin Fowler
Martin Fowler
雷峰网
雷峰网
酷 壳 – CoolShell
酷 壳 – CoolShell
J
Java Code Geeks
Microsoft Azure Blog
Microsoft Azure Blog

博客园 - uxinxin

.NET10 中配置Swagger的记录 .NET10中通过appsettings.json配置文件获取信息的几个方法 学习使用Taurus的微服务群在.NET Framework4.8环境下的搭建 .net framework 中Owin 通过启动类 Startup.cs 使用 SignalR B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【八】 B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【七】 B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【六】 B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【五】 B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【四】 B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【二】 B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 .NET程序屏蔽一些无效蜘蛛的访问配置 asp.net 动态加载与卸载程序集的尝试(没有成功)欢迎解决的朋友留言告知 Framework 4.6.2下的SignalR使用,以及WPF下同步使用 react 16.8.4版本中的生命周期中的细节 在组件挂在时使用了定时器的处理——尚硅谷React教程(2022加更,B站超火react教程)学习笔记 CYQ.Data的XML操作的一些自己使用记录 IIS URL Rewrite将伪静态配置文件放在web.config外部 ASP.NET Core EF MVC 登录验证 一步步教你用html+div+css+js基于Jquery实现一套数字华容道游戏
B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习...
uxinxin · 2024-12-04 · via 博客园 - uxinxin

播放地址: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课代码实现的逻辑以及作用,承上启下告知后续会如何调整代码让使用逻辑更加灵活