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

一、示例需求说明

以进度条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 属性  
        }  
    }  
}

 

posted @ 2024-03-22 16:16  搬砖滴  阅读(8)  评论(0编辑  收藏  举报