首页 > 其他分享 >动态控件之控件的数据绑定

动态控件之控件的数据绑定

时间:2024-03-22 16:22:24浏览次数:20  
标签:控件 绑定 progressBar isBusy IsVisible IsBusy 动态 ProgressBar

一、示例需求说明

以进度条ProgressBar控件为例,C# 动态生成ProgressBar实例_progressBar,并指定_progressBar.IsVisible = IsBusy,当iIsBusy发生变化时,需要产生相应的效果。

 

二、方式一

定义属性:

bool _isBusy = false;
public bool IsBusy
{
    get => _isBusy;
    set
    {
        if (_isBusy != value)
        {
            _isBusy = value;
            _progressBar.IsVisible=_isBusy;
        }
    }
}

控件初始化:

ProgressBar _progressBar = new ProgressBar();
_progressBar.IsIndeterminate = true;
_progressBar.IsVisible = IsBusy;

IsBusy数据改变:

// 在某个地方(例如按钮点击事件处理程序中)更改 IsBusy 的值  
IsBusy = true; // 这将使 ProgressBar 可见  
// ... 一些耗时的操作 ...  
IsBusy = false; // 这将使 ProgressBar 不可见

这种方式简单方便,但不一定适用于所有情况,如果需要更改的控件比较多,维护复杂。

三、方式二

通过事件的方式进行处理。

当前类继承INotifyPropertyChanged 

public partial class MusicStoreView : UserControl,INotifyPropertyChanged

 

定义属性:

bool _isBusy = false;
public bool IsBusy
{
    get => _isBusy;
    set
    {
        if (_isBusy != value)
        {
            _isBusy = value;
            OnPropertyChanged(nameof(IsBusy));
        }
    }
}

 

事件的代码:

public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

属性改变引起的事件:

// 创建ProgressBar  
_progressBar = new ProgressBar();
_progressBar.IsIndeterminate = true;
_progressBar.IsVisible = IsBusy;
this.PropertyChanged += (sender, e) =>
{
    if (e.PropertyName == nameof(IsBusy))
    {
        _progressBar.IsVisible = IsBusy; // 更新 ProgressBar 的 IsVisible 属性  
    }
};

IsBusy发生变化时代码:

// 在某个地方(例如按钮点击事件处理程序中)更改 IsBusy 的值  
IsBusy = true; // 这将使 ProgressBar 可见  
// ... 一些耗时的操作 ...  
IsBusy = false; // 这将使 ProgressBar 不可见

 

三、建议

在 Avalonia UI 或大多数现代 UI 框架中,当你想要根据某个属性的变化来动态更新控件的属性时,通常推荐的做法是通过实现 INotifyPropertyChanged 接口并使用事件来处理属性的变化,而不是直接设置控件的属性。这样做的好处是,它遵循了数据驱动 UI 的原则,使得 UI 和数据之间的关系更加清晰和可维护。

下面是完整的示例:

public class MyPage : UserControl, INotifyPropertyChanged  
{  
    private bool _isBusy;  
    private ProgressBar _progressBar;  
  
    public bool IsBusy  
    {  
        get => _isBusy;  
        set  
        {  
            if (_isBusy != value)  
            {  
                _isBusy = value;  
                OnPropertyChanged(nameof(IsBusy)); // 触发 PropertyChanged 事件  
            }  
        }  
    }  
  
    public event PropertyChangedEventHandler PropertyChanged;  
  
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)  
    {  
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));  
    }  
  
    public MyPage()  
    {  
        InitializeComponent();  
    }  
  
    private void InitializeComponent()  
    {  
        AvaloniaXamlLoader.Load(this);          
        if (_progressBar != null)  
        {  
            this.PropertyChanged += OnPropertyChangedHandler; // 订阅 PropertyChanged 事件  
        }  
    }  
  
    private void OnPropertyChangedHandler(object sender, PropertyChangedEventArgs e)  
    {  
        if (e.PropertyName == nameof(IsBusy))  
        {  
            _progressBar.IsVisible = IsBusy; // 根据 IsBusy 的值更新 ProgressBar 的 IsVisible 属性  
        }  
    }  
}

 

标签:控件,绑定,progressBar,isBusy,IsVisible,IsBusy,动态,ProgressBar
From: https://www.cnblogs.com/qtiger/p/18089749

相关文章

  • C# 02 控件
    1.焦点状态ActiveControl和FocusActiveControl=textBox1;默认光标焦点在文本框textBox1处textBox1.Focus();焦点转移到textBox12.日期选择显示在文本框创建伪DateTimePicker:TextBox文本框并上DateTimePicker缩小至箭头版。privatevoiddateTimePicker1_Cl......
  • ruoyi-nbcio-plus基于vue3的flowable增加开始节点的表单绑定修改
    更多ruoyi-nbcio功能请看演示系统gitee源代码地址前后端代码:https://gitee.com/nbacheng/ruoyi-nbcio演示地址:RuoYi-Nbcio后台管理系统http://122.227.135.243:9666/更多nbcio-boot功能请看演示系统 gitee源代码地址后端代码:https://gitee.com/nbacheng/nbcio-boot......
  • 多维背包问题动态规划算法
    #include <iostream>  #include <vector>  using namespace std;//定义物品结构体 struct Item {    int id;    int weight;    int volume;    int value;};//初始化背包的容量限制 const int MAX_WEIGHT=50;const ......
  • 中电金信:技术浅谈 | 动态规划算法的原理和实现
    ​导语:动态规划(Dynamicprogramming)是一种在数学、计算机科学和经济学中使用的方法。动态规划算法与分治法类似,通过将带求解的问题分解为若干个相对简单的子问题(阶段)的方式,来求解复杂问题。本文作者用相对精炼的篇幅内容对动态规划算法进行背景及原理介绍,并举例说明如何进行问题......
  • yml文件-动态开关
    本质:${}读取字符串方案一增加一个属性swith来判断业务流走向//test.swith是配置文件中定义的参数@value("${test.swith}")Stringswith;publicvoidfunc(){if("on".equals(swith)){//执行对应的定时任务代码}} 方案二通过@ConditionalOnProperty......
  • Three.js基础入门介绍——【毕业季】Three.js动态相册
    前言岁月匆匆,又是一年毕业季,这次做个动态相册展示图片,放些有意思的内容,一起回忆下校园生活吧。预期效果相册展示和点选切换,利用相机旋转和移动来实现一个点击切图平滑过渡的效果。实现流程基本流程1、搭建场景2、放置图片3、鼠标事件4、相机运动工程文件工程......
  • 动态控件之ItemsPanelTemplate
    一、Axaml生成列表框有一个属性,其中包含一个用于布局列表项的模板控件。默认情况下,这是一个堆叠面板。为了使专辑封面填充所有空间,可以将面板模板更改为包装面板。方式如下:<ListBoxItemsSource="{BindingSearchResults}"SelectedItem="{BindingSelectedAlbum}"Backgro......
  • web常用控件和弹窗
    web常见控件介绍 常见的控件: 1.文本输入框(TextBox) 2.按钮控件(Button) 3.下拉选框(DropList) 4.日期/时间控件(Date/TimePicker) 5.(图片、文件)上传控件(Upload)  6.树形控件(TreeView) 7.列表框(ListBox) 8.多格式文本框(RichTextBox)  9.Tab控件10.其他控件......
  • Java中的代理模式(动态代理和静态代理)
    代理模式我们先了解一下代理模式:在开发中,当我们要访问目标类时,不是直接访问目标类,而是访问器代理类。通过代理类调用目标类完成操作。简单来说就是:把直接访问变为间接访问。这样做的最大好处就是:我们可以在代理类调用目标类之前和之后去添加一些预处理和后处理操作。来扩展......
  • 智能查询报表:展现动态SQL的魅力与实用性
    背景介绍报表是现代企业信息化不可缺少的统计分析工具,它主要用来实现企业内相对固定的资金日报、销售周报、财务月报以及关键数据的统计分析等较为细致的数据展示分析。动态SQL查询报表是指根据提供的条件,结合相关的表达式,在运行时动态地构建SQL查询语句并生成报表的过程。它允许......