C# Stopwatch.IsRunning上的绑定开始/停止文本-属性已更改

C# Stopwatch.IsRunning上的绑定开始/停止文本-属性已更改,c#,wpf,stopwatch,C#,Wpf,Stopwatch,我在xaml中有类似的内容: <Button Content="{Binding MyStopwatch.IsRunning, Converter={StaticResource BoolToStr}}"/> 当IsRunning为false时,我需要显示Start;当IsRunning为true时,我需要显示Stop。 我对转换器或绑定本身没有问题 我在刷新IsRunning属性时遇到问题。 当正在运行时在程序运行时属性更改,它不会更改启动/停止文本 我知道如

我在xaml中有类似的内容:

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

IsRunning
为false时,我需要显示Start;当
IsRunning
为true时,我需要显示Stop。 我对转换器或绑定本身没有问题

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

我知道如何在自己的属性上实现INotifyPropertyChange。
但是我不知道如何在
IsRunning

上实现(类似)属性更改您不能使
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));
    }
}

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

OnPropertyChanged("MyStopwatch");

绑定到CLR属性时无法获得更改通知,该属性必须是依赖项属性,或者该类应实现INotifyPropertyChanged。将秒表包装到实现INotifyPropertyChanged的类中,并在调用Start/Stop后更改IsRunning。@Islam-这根本不是真的。我们可以绑定到CLR属性,而无需实现INPC。唯一的问题是绑定不会在属性发生任何更改时在GUI上刷新。@Rohit这就是我的意思!编辑了注释。但是在这种情况下,在
MyStopwatch
上提升
PropertyChanged
就可以了,因为它是绑定本身的一部分。这不起作用。我不是在等MyStopwatch的财产。但是我正在等待MyStopwatch。IsRunning…你的类是
MyStopwatch
所在的地方吗执行
INPC
,因为我累了它对我来说工作正常吗?你的完整绑定路径是
MyStopwatch.IsRunning
,所以万一MyStopwatch上的propertyChanged也被引发,它将刷新UI上的绑定。唯一的另一种方法是拥有您自己的定制秒表,它将在开始和停止时引发事件,您可以连接到这些事件,如另一个答案中所述。Ok.Ok。谢谢你的评论和回答。