我遇到了文本框'文字'绑定的问题。这是代码:
<TextBox Padding="2"
AcceptsReturn="True"
AcceptsTab="True"
Name="txtCmd"
Text="{Binding CommandText,
Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
这是VM属性:
private string _CommandText;
public string CommandText
{
get
{
return this._CommandText;
}
set
{
if(!(value == this._CommandText))
{
this._CommandText = value;
if (this._CommandText.IndexOf("\r\n") > -1)
{
ParseCommand(this._CommandText)
this._CommandText = "";
}
base.OnPropertyChanged("CommandText");
}
}
}
问题是:当我在文本框中按Enter键时,ParseCommand调用并执行它必须执行的操作,同时,_CommandText将设置为(“”),但它不会影响textbox.text值,我的意思是,下次按Enter键时,_CommandText中仍有一些'\ r \ n'!
有什么我做错的吗?任何帮助将不胜感激。
答案 0 :(得分:2)
我认为你可能会更好地处理这种情况。您不需要绑定文本,因为您不想同步数据但是处理输入,因此使用输入事件可能是更好的主意。
这可以与命令和Blend SDK's Interactivity
相结合,例如
<TextBox Padding="2">
<i:Interaction.Triggers>
<t:KeyDownTrigger Key="Return">
<i:InvokeCommandAction Command="{Binding ProcessCommandCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=TextBox}}" />
</t:KeyDownTrigger>
</i:Interaction.Triggers>
</TextBox>
KeyDownTrigger的定义如下:
public class KeyDownTrigger : TriggerBase<TextBox>
{
public Key Key { get; set; }
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.PreviewKeyDown += new System.Windows.Input.KeyEventHandler(AssociatedObject_PreviewKeyDown);
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.PreviewKeyDown -= AssociatedObject_PreviewKeyDown;
}
void AssociatedObject_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == Key)
{
InvokeActions(null);
}
}
}
命令如下:
private readonly Command _ProcessCommandCommand = new Command(p =>
{
var tb = (TextBox)p;
var command = tb.Text;
// <Process command>
tb.Clear();
});
public Command ProcessCommandCommand { get { return _ProcessCommandCommand; } }
(Command
是人们喜欢调用的RelayCommand
,ICommand
的通用实现,它使用在构造函数中传递的函数)
答案 1 :(得分:0)
我不知道TextBox这种行为的确切原因,但要解决问题集_CommandText = null而不是“”。这是示例代码。
private string _CommandText;
public string CommandText
{
get
{
return this._CommandText;
}
set
{
if(!(value == this._CommandText))
{
this._CommandText = value;
if (this._CommandText.Contains("\r\n"))
{
ParseCommand(this._CommandText)
this._CommandText = null;
}
base.OnPropertyChanged("CommandText");
}
}
}