【问题标题】:Binding Start/Stop text on Stopwatch.IsRunning - Property Changed在 Stopwatch.IsRunning 上绑定开始/停止文本 - 属性已更改
【发布时间】:2013-08-12 18:47:09
【问题描述】:

我在 xaml 中有这样的东西:

<Button Content="{Binding MyStopwatch.IsRunning,
        Converter={StaticResource BoolToStr}}"/>

IsRunning 为假时,我需要显示开始,当IsRunning 为真时,我需要显示停止。 我对转换器或绑定本身没有任何问题。

我在刷新 IsRunning 属性时遇到问题。 当IsRunning 属性更改而程序正在运行时 - 它不会更改启动/停止文本。

我知道如何在我自己的属性上实现INotifyPropertyChange。 但我不知道如何在IsRunning 上实现(类似的)属性更改

【问题讨论】:

  • 绑定到 CLR 属性时无法收到更改通知,它必须是依赖属性或者类应该实现 INotifyPropertyChanged。
  • 将您的秒表包装到一个实现 INotifyPropertyChanged 的​​类中,并在调用 Start/Stop 后更改 IsRunning。
  • @Islam - 这根本不是真的。我们可以在不实现 INPC 的情况下绑定到 CLR 属性。唯一的问题是,在属性发生任何变化时,GUI 上的绑定都不会刷新。
  • @Rohit 这就是我的意思!编辑了评论。
  • 但是在这种情况下,在 MyStopwatch 上提高 PropertyChanged 就可以了,因为它是绑定本身的一部分。

标签: c# wpf stopwatch


【解决方案1】:

如果您想更新您的绑定,您可以在启动或停止秒表时调用属性MyStopwatch 上的PropertyChanged

OnPropertyChanged("MyStopwatch");

【讨论】:

  • 这不起作用。我不是在等待 MyStopwatch 财产。但我正在等待 MyStopwatch.IsRunning...
  • MyStopwatch 所在的班级是否实施了INPC,因为我厌倦了它对我的工作正常?
  • 您的完整绑定路径是MyStopwatch.IsRunning,因此如果在 MyStopwatch 上也引发了 propertyChanged,它将刷新 UI 上的绑定。
  • 唯一的其他方法是拥有自己的自定义秒表,它会在开始和停止时引发事件,您可以像另一个答案中提到的那样挂钩。
  • 好的,好的。感谢您的 cmets 和答案。
【解决方案2】:

你不能让StopWatch 实现INotifyPropertyChanged。您可以做的是为它创建自己的包装器,然后使用它。例如:

public class StopwatchWrapper : INotifyPropertyChanged
{
    Stopwatch _stopwatch;

    private bool _isRunning;
    public bool IsRunning
    {
        get { return _isRunning; }
        set
        {
            if (_isRunning != value)
            {
                _isRunning = value;
                OnPropertyChanged("IsRunning");
            }
        }
    }

    public StopwatchWrapper()
    {
        _stopwatch = new Stopwatch();
        _isRunning = false;
    }

    public void Start()
    {
        _stopwatch.Start();
        IsRunning = _stopwatch.IsRunning;
    }

    public void Stop() 
    {
        _stopwatch.Stop();
        IsRunning = _stopwatch.IsRunning;
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多