我在MainWindow
中设置了一个DataContext .
<Window.DataContext>
<viewmodel:MainViewModel/>
</Window.DataContext>
而MainViewModel
有一个属性叫做Message
class MainViewModel : ObservableObject
{
private string _message;
public string Message
{
get { return _message; }
set
{
_message = value;
OnPropertyChanged();
}
}
}
ObservableObject
是超级简单的
class ObservableObject
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
我面临的问题是我的TextBox
..正如我们在这里看到的,我目前将Text
属性绑定到Message
<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>
的命令SendMessageCommand = new RelayCommand(o =>
{
MessageBox.Show(Message);
Message = string.Empty;
});
和绑定工作得很好!唯一的问题是,当我将Message
设置为""
或string.Empty
时,它实际上并不反映在视图上。
让我们来看看这个例子,如果我在TextBox
中输入"Hello"
然后点击Enter
它会显示一个MessageBox
和"Hello"
的文本我们可以看到,如果我们查看命令,我将Message
属性设置为string.Empty
但是它不会更新TextBox
的文本,它仍然会显示"Hello"
,这很奇怪,因为如果我再次点击回车它会显示一个空的MessageBox
为什么?这是臭虫吗?
您应该实现接口INotifyPropertyChanged
:
class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
否则,你的视图不能订阅事件,这意味着当你的属性值发生变化时,视图永远不会被通知。