所以我MainWindow
在其中设置了像这样的DataContext。
<Window.DataContext>
<viewmodel:MainViewModel/>
</Window.DataContext>
并且TheMainViewModel
具有一个称为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
它实际上不会反映在视图上。
让我们这个例子中,如果我在输入"Hello"
进入TextBox
并点击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));
}
}
否则,您的视图将无法订阅该事件,这意味着当您的属性值更改时,视图将永远不会得到通知。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句