【问题标题】:Binding WPF Progress Bar never updating绑定 WPF 进度条从不更新
【发布时间】:2015-02-05 22:55:40
【问题描述】:

在 OnPropertyChanged() 期间,PropertyChanged 事件始终为 NULL,因此该事件永远不会被调用。我错过了什么?

这是 XML 代码:

<ProgressBar x:Name="ProgressBar1" Value="{Binding PBarValue, UpdateSourceTrigger=PropertyChanged}" Width="200" Height="20" Minimum="0" Maximum="100"></ProgressBar>

C#代码:

public PBar progress_bar = new PBar();

public class PBar : INotifyPropertyChanged
{
    private int _progress;
    public int progress
    {
        get { return _progress; }
        set
        {
            if (value != _progress)
            {
                _progress = value;
                OnPropertyChanged("PBarValue");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}

private void Main_Initialized(object sender, EventArgs e)
{
    ProgressBar1.DataContext = progress_bar;
    progress_bar.progress=75;  // This does call the set and
                               // OnPropertyChanged but
                               // PropertyChanged is always null
                               // so it never updates UI
}

我正在从另一个线程设置进度条的“值”,所以这就是我需要绑定的原因。

我已经尝试了这么多不同的方法,此时我的头在旋转!

【问题讨论】:

  • 不管可能的多线程问题:您正在为属性PBarValue 触发PropertyChanged 事件,这将导致绑定通过反射查找属性PBarValue 的值。但是,您似乎没有该名称的属性。绑定无法知道您是否希望它检索 progress 属性的值,如果这是您想要的。
  • PBarValue 是 XML 中绑定语句中 value 属性的名称。这不正确吗?
  • 绑定中指示的属性名称必须与对象中的实际属性名称相匹配,因此可以绑定任何内容。目前,它没有。

标签: c# wpf


【解决方案1】:

更改您的 xaml 以绑定到进度:

<ProgressBar x:Name="ProgressBar1" Value="{Binding progress, UpdateSourceTrigger=PropertyChanged}" Width="200" Height="20" Minimum="0" Maximum="100"></ProgressBar>

然后更改您的属性以引发关于“进度”而不是“PBarValue”的通知:

private int _progress;
public int progress
{
    get { return _progress; }
    set
    {
        if (value != _progress)
        {
            _progress = value;
            OnPropertyChanged("progress");
        }
    }
}

【讨论】:

  • 完美!现在看起来很清晰......有时你可以只见树木不见森林!
【解决方案2】:

请将 XAML 中的绑定从 PBarValue 更改为 progress。参考下面的代码。

<ProgressBar x:Name="ProgressBar1" Value="{Binding progress, UpdateSourceTrigger=PropertyChanged}" Width="200" Height="20" Minimum="0" Maximum="100"></ProgressBar>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多