【wpf】关于绑定的一点明悟

news2024/9/23 23:28:59

背景简介

软件功能为,读取一个文件夹下的所有子文件夹,每个文件夹对自动对应生成 一组 “按键+四个勾选”
在这里插入图片描述
按键点击触发,可以发送与其对应文件夹中的一些内容。这个绑定的过程我在之前的文章有过详细的介绍,非常的简单。
这里回顾一下,贴一段代码:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <DockPanel>
        <Label DockPanel.Dock="Right"  Content="{Binding BtnName}"/>
        <Button DockPanel.Dock="Right" Command="{Binding NextCmd}">下一个</Button>
        <Button DockPanel.Dock="Right" Command="{Binding FliesReloadCmd}">文件重载</Button>
        <hc:TextBox Text="{Binding saveInfo.BaseDirectoryPath}"
             hc:TitleElement.Title="路径:" 
             hc:TitleElement.TitlePlacement="Left"
             hc:TitleElement.HorizontalAlignment="Center"
             hc:TitleElement.TitleWidth="50"/>
        
    </DockPanel>
    <ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible" >
        <ItemsControl ItemsSource="{Binding ButtonList}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid Columns="4"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid Margin="5">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <Button Content="{Binding Name}" Command="{Binding RelativeSource={RelativeSource 
          Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.TestCmd}"
          CommandParameter="{Binding Path=Content, RelativeSource={RelativeSource Mode=TemplatedParent}}"/>
                        <StackPanel Grid.Column="1" VerticalAlignment="Center">
                            <CheckBox IsChecked="{Binding Bottom}"/>
                            <CheckBox IsChecked="{Binding Middle}"/>
                            <UniformGrid Columns="2">
                                <CheckBox IsChecked="{Binding Head}"/>
                                <CheckBox IsChecked="{Binding Ptb}"/>
                            </UniformGrid>

                        </StackPanel>
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </ScrollViewer>
    
</Grid>

明悟

现在,我需要一个新的功能,因为一个个的按照顺序点按钮实在是太低效了。我增加了一个下一个 按钮。 我的目的是,通过下一个按钮来代替,“一个个的按照顺序点按钮” 这个操作!

迷雾

现在换成你,你能给出一个思路吗? 我马上就有了思路: 那,只要我在下一个
按钮对应的事件中,获取到所有对象的实例,然后再触发按键按下不久行了?

于是我立刻查看了后台代码!

public ObservableCollection<BtnItem> ButtonList { get; set; } = new ObservableCollection<BtnItem>();

由于我们使用的是绑定,使用后台的数组,其实是按键对应的数据,而不是按键本身。
要想得到按键的实例,似乎没有很直接的方式。结果我就在,如何通过数据源获取界面对象实例
这个问题上陷入沉思!

明悟

突然,一个念头突然打破了循环,既然是绑定,为啥我还需要界面的那些按键对象?是因为要那一个个触发按键吗?但是触发按键是表现,实际的目的是实现:按键触发,可以发送与其对应文件夹中的一些内容
于是,注意力就从按键的点击,到了功能的实现!现在回到最初的诉求!

增加了一个下一个 按钮。 我的目的是,通过下一个按钮来代替,“一个个的按照顺序点按钮” 这个操作!

再之前的代码里,我已经实现了最初的功能(按键触发,可以发送与其对应文件夹中的一些内容),现在只是增加了一个下一个 按钮来代替。
之前的代码:

 void Test(BtnItem btnItem)
{
    try
    {
    	//发送功能,省略
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

BtnItem 就是按键绑定数组的子项。也只是个数据。Test通过接收这个数据,得知是哪个按键按下。

所以下一个按键对应的事件,直接调用Test,并传入对应的BtnItem就好了!这样就是和界面点击按键一样了!

//下一张
NextCmd = new DelegateCommand(() =>
{  
    //MessageBox.Show(ButtonList[btnIndex].Name);
    if (btnIndex < ButtonList.Count - 1)
    {
        Test(ButtonList[btnIndex]);
        btnIndex++;
    }
    else
    {
        MessageBox.Show("完毕了!");    
    }
});

所以,这里是需要利用ButtonList,并记录下btnIndex。就能实现轮询按按钮的功能。

小结

轮询按按钮这个动作,让我的思维产生的偏差,让我一直想如何获取界面的按键对象!
但是,我们完成的绑定之后,就一定要注意通过数据驱动界面,或者直接用数据解决问题,不要马上去想着获取界面对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1490198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++干货基地】面向对象核心概念 | 访问限定符 | 类域 | 实例化 | 类对象模型

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

【数据库】SQLite的基本指令、数据约束、联结表、触发器及索引的使用技巧

目录 一、SQLite 语句基础 1、创建表&#xff1a;create 语句 2、创建表&#xff1a;create 语句 (设置主键&#xff09; ​编辑 3、查看表 4、修改表&#xff1a;alter 5、删除表&#xff1a;drop table 语句 6、插入新行&#xff1a;insert into 语句--全部赋值 7、…

【AI视野·今日Robot 机器人论文速览 第八十期】Fri, 1 Mar 2024

AI视野今日CS.Robotics 机器人学论文速览 Fri, 1 Mar 2024 Totally 32 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Humanoid Locomotion as Next Token Prediction Authors Ilija Radosavovic, Bike Zhang, Baifeng Shi, Jathushan Rajasegaran…

上位机图像处理和嵌入式模块部署(qmacvisual配置)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们谈到了qmacvisual的编译、验证码、用户登录以及流程的编辑&#xff0c;这部分都是基础工作。事实上&#xff0c;除了这些内容之外&#xf…

uniapp制作--进步器的选择

介绍&#xff1a; 进步器的选择,一般用于商城购物选择物品数量的场景 注意&#xff1a;该输入框只能输入大于或等于0的整数 效果展示&#xff1a; 代码展示&#xff1a; 以下是一个简单的购物车页面示例&#xff0c;包括选择商品和显示数量的功能&#xff1a; 在这个示例中…

电动车检测解决方案官网版(1)

电动车检测解决方案 方案背景 现状分析&#xff1a;①电动车私拉电线、电池老化、线路故障容易引发火灾。 ②电动车充电时温度无法检测&#xff0c;无法提前预警。 ③近五年&#xff0c;全国共发生电动车火灾1万余起&#xff0c;年均约2000起&#xff0c;较前五年增长33.3%. …

uipath调用js代码

1&#xff0c;调用js代码&#xff0c;不带参数&#xff0c;没有返回值 为了去掉按钮的disabled属性 function(){ document.getElementsByClassName(submitBtn)[0].removeAttribute(disabled); } 2&#xff0c;调用js代码&#xff0c;带参数&#xff0c;没有返回值 输入参数&a…

Vue-02

开发者工具 安装插件&#xff0c;用于调试 Vue 应用。 https://chrome.zzzmh.cn/index 搜索 Vue &#xff0c;下载 Vue.js Devtools &#xff0c;此插件可以帮助更新信息&#xff0c;而不通过控制台更新&#xff0c;更方便调试。 注&#xff1a;安装插件后&#xff0c;记得在插…

05. Nginx入门-Nginx访问控制

测试环境 此处使用的yum安装的Nginx路径。 此处域名均在本地配置hosts。 主配置文件 路径&#xff1a;/etc/nginx/nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connection…

安卓开发:时间选择器

activity_main.xml <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"http://sc…

高效备考一级数据分析师考试《CDA Level I 实操训练营》3月30日开课!

曾经报名了考试&#xff0c;买了教程辅导书&#xff0c;却因为各种原因没有坚持学习&#xff0c;这样的经历可能让你感到沮丧和失望。但是&#xff0c;失败并不代表终结&#xff0c;而是迈向成功的必经之路。为了帮助大家能够快速学习考试相关知识&#xff0c;特别为CDA LEVEL …

面试问答总结之Java进阶

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;注解Annotaion &#xff08;java标注&#xff09;&#x1f415;内置注解&#x1f415;元注解 &#x1f380;对象克隆&#x1f415;如何实现克隆&#x1f415;如何实现深克…

Linux第70步_新字符设备驱动的一般模板

1、了解“申请和释放设备号函数” int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name) //注册字符设备驱动 //dev&#xff1a;保存申请到的设备号 //baseminor&#xff1a;次设备号的起始地址 //count&#xff1a;要申请的设备数…

【Java设计模式】五、建造者模式

文章目录 1、建造者模式2、案例&#xff1a;共享单车的创建3、其他用途 1、建造者模式 某个对象的构建复杂将复杂的对象的创建 和 属性赋值所分离&#xff0c;使得同样的构建过程可以创建不同的表示建造的过程和细节调用者不需要知道&#xff0c;只需要通过构建者去进行操作 …

Spring(22) Spring中的9种设计模式

目录 一、简单工厂模式&#xff08;Simple Factory&#xff09;二、工厂方法模式&#xff08;Factory Method&#xff09;三、单例模式&#xff08;Singleton&#xff09;四、适配器模式&#xff08;Adapter&#xff09;五、代理模式&#xff08;Proxy&#xff09;七、观察者模…

将jar包打包成exe可执行文件的工具介绍

在Java开发中&#xff0c;将.jar包打包成可执行的.exe文件是一种常见的需求&#xff0c;尤其是在需要将Java应用程序分发给没有安装Java虚拟机&#xff08;JVM&#xff09;的普通用户时。有多种工具可以将Java应用程序打包成.exe文件&#xff0c;这些工具通常使用Java的launch4…

从Win转Mac,我的感受如何

文章目录 前言MacBook优点美观动画流畅安装软件方便轻便、续航强大多数命令和Linux通用系统稳定、安全做工精美、视听体验好CPU性能较好触控板体验好 MacBook缺点缺乏部分软件部分操作逻辑不是很科学&#xff1f;玩不了多少游戏 总结与展望 前言 整个大学期间&#xff0c;我的主…

Flutter中的Provider状态管理工具有哪些优势

在Flutter应用开发中&#xff0c;状态管理是一个至关重要的方面。而Provider作为一种简单、灵活且高效的状态管理工具&#xff0c;在众多Flutter开发者中备受青睐。本文将深入探讨Provider在Flutter中的优势&#xff0c;帮助读者更好地理解其价值和应用场景。 简单易用 Provi…

最全AI领域知识星球:GoAI的学习社区

最全AI领域知识星球&#xff1a;GoAI的学习社区 【作者及星球介绍】 &#x1f468;‍&#x1f4bb;作者简介&#xff1a; CSDN、阿里云人工智能领域博客专家&#xff0c;新星计划计算机视觉导师&#xff0c;百度飞桨PPDE&#xff0c;专注大数据与AI知识分享。 ✨公众号&#x…

深度学习算法优化流程

深度学习算法的一般优化流程&#xff0c;具体的实施方法和步骤可能会根据具体任务和数据的特点而有所不同&#xff0c;优化流程通常包括以下几个主要步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作…