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继承,我只是实现了接口,谢谢!有时,人们看不到森林,因为那里有太多的树。不客气!