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

背景简介

软件功能为,读取一个文件夹下的所有子文件夹,每个文件夹对自动对应生成 一组 "按键+四个勾选"

按键点击触发,可以发送与其对应文件夹中的一些内容 。这个绑定的过程我在之前的文章有过详细的介绍,非常的简单。

这里回顾一下,贴一段代码:

xml 复制代码
<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>

明悟

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

迷雾

现在换成你,你能给出一个思路吗? 我马上就有了思路: 那,只要我在下一个

按钮对应的事件中,获取到所有对象的实例,然后再触发按键按下不久行了?

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

csharp 复制代码
public ObservableCollection<BtnItem> ButtonList { get; set; } = new ObservableCollection<BtnItem>();

由于我们使用的是绑定,使用后台的数组,其实是按键对应的数据,而不是按键本身。

要想得到按键的实例,似乎没有很直接的方式。结果我就在,如何通过数据源获取界面对象实例

这个问题上陷入沉思!

明悟

突然,一个念头突然打破的循环,既然是绑定,为啥我还需要界面的那些按键对象?是因为要那一个个触发按键吗?但是触发按键是表现,实际的目的是实现:按键触发,可以发送与其对应文件夹中的一些内容

于是,注意力就从按键的点击,到了功能的实现!现在回到最初的诉求!

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

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

之前的代码:

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

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

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

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

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

小结

轮询按按钮这个动作,让我的思维产生的偏差,让我一直想如何获取界面的按键对象!

但是,我们完成的绑定之后,就一定要注意通过数据驱动界面,能够直接用数据解决的问题,就不要去想着获取界面对象。

相关推荐
做个文艺程序员1 天前
MQ第12篇:AI原生消息架构演进:从MQ到事件驱动的全链路设计
架构·消息队列·wpf·事件驱动架构·ai-native·cqrs
donk13143 天前
React Native for OpenHarmony 实战:三方库 react-native-circular-action-menu 的鸿蒙化适配指南
javascript·分布式·react native·react.js·wpf·harmonyos
donk13144 天前
React Native for OpenHarmony 实战:三方库 react-native-step-indicator 的鸿蒙化适配指南
分布式·react native·react.js·wpf·harmonyos
He BianGu4 天前
【笔记】WPF中RenderOptions类的详细功能
笔记·wpf
VidDown4 天前
上线三个月后的第一次事故:一个 Django 服务的日志、监控与故障复盘
数据库·python·django·wpf·音视频·视频编解码
He BianGu4 天前
【笔记】WPF中CachingHint的功能
笔记·wpf
He BianGu4 天前
【笔记】在WPF中BitmapScalingMode的作用
笔记·wpf
Vae_Mars5 天前
幂等性学习笔记
笔记·学习·wpf
samble6 天前
从零搭建灌装监控系统(十九):单元测试实战,xUnit + 内存SQLite + 反射测试私有方法
c#·wpf·mvvm·modbus·工业控制
光泽雨7 天前
路由概念和路由事件 继承链路 RadioButton的事件解析
wpf