C# 为什么我的文本框在我将文本设置为string.Empty后不清除文本

C# 为什么我的文本框在我将文本设置为string.Empty后不清除文本,c#,.net,wpf,mvvm,C#,.net,Wpf,Mvvm,所以我有了我的main窗口,在其中我设置了一个DataContext,如下所示 <Window.DataContext> <viewmodel:MainViewModel/> </Window.DataContext> 可观察对象非常简单 class ObservableObject { public event PropertyChangedEventHandler PropertyChanged; protected virtua

所以我有了我的
main窗口
,在其中我设置了一个DataContext,如下所示

<Window.DataContext>
    <viewmodel:MainViewModel/>
</Window.DataContext>
可观察对象
非常简单

class ObservableObject
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
我面临的问题是我的
文本框的绑定。。正如我们在这里看到的,我目前正在将
文本
属性绑定到
消息

class MainViewModel : ObservableObject
{
private string _message;

public string Message
{
    get { return _message; }
    set
    {
        _message = value;
        OnPropertyChanged();
    }
}

}
<TextBox Text="{Binding Message, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
         VerticalAlignment="Center"
         Foreground="LightGray"
         BorderThickness="0"
         Margin="15,0,0,0"
         Width="600"
         TextWrapping="Wrap"
         x:Name="MessageBox">
    <TextBox.InputBindings>
        <KeyBinding Key="Return"
                    Command="{Binding SendMessageCommand}"/>
    </TextBox.InputBindings>
</TextBox>
而且装订效果很好!唯一的问题是,当我将
Message
设置为
string.Empty时,它实际上不会反映在视图中

让我们举个例子,如果我在
文本框中键入
“Hello”
,然后单击
Enter
,它将显示一个
MessageBox
,文本为
“Hello”
,我们可以看到如果我们查看命令,我正在将
Message
属性设置为
string.Empty
,但它不会更新
TextBox
文本,它仍然会说
“Hello”
,这很奇怪,因为如果我再次单击enter,它会显示一个空的
MessageBox


为什么呢?这是一个bug吗?

您应该实现接口
INotifyPropertyChanged

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

否则,您的视图将无法订阅事件,这意味着当您的属性值更改时,将永远不会通知视图。

您应该实现接口
INotifyPropertyChanged

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

否则,您的视图将无法订阅事件,这意味着当您的属性值更改时,视图将永远不会得到通知。

当您在文本框中键入时,将调用
OnPropertyChanged
。但在RelayCommand中,它不是。@ArAui我尝试调用了
OnPropertyChanged()在设置
Message=string.Empty
之后,它仍然没有做任何事情,它会以任何方式调用它,因为我在
set
内部调用它,很抱歉我上面的评论不完整。我认为虚拟方法似乎无法在lambda中调用。您是否查看了输出窗口?有例外吗?@MichałTurczyn我有例外是的,没有例外。当你在文本框中键入时,
OnPropertyChanged
已被调用。但在RelayCommand中,它不是。@ArAui我尝试调用了
OnPropertyChanged()在设置
Message=string.Empty
之后,它仍然没有做任何事情,它会以任何方式调用它,因为我在
set
内部调用它,很抱歉我上面的评论不完整。我认为虚拟方法似乎无法在lambda中调用。您是否查看了输出窗口?有例外吗?@MichałTurczyn我有例外是的,没有例外。哇。。我完全忘记了我需要从INPC继承,我只是实现了接口,谢谢!有时,人们看不到森林,因为那里有太多的树。不客气!哇!我完全忘记了我需要从INPC继承,我只是实现了接口,谢谢!有时,人们看不到森林,因为那里有太多的树。不客气!