我有一个文本框,我在其中处理其文本更改事件。现在,当我单击按钮时,我想清除文本框中的文本。
现在,当我在文本框中有文本时,当我调用我的命令时,文本不会被清除。
xaml
<TextBox Text="{Binding SearchText,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" Name="mytxtBox">
<TextBox.InputBindings>
<KeyBinding Command="{Binding Path=SearchCommand}" CommandParameter="{Binding ElementName=mytxtBox, Path=Text}" Key="Enter"/>
</TextBox.InputBindings>
</TextBox>
视图模型
public string SearchText
{
get
{
return TypedText;
}
set
{
TypedText=value;
if (string.IsNullOrEmpty(TypedText.ToString()))// This is called when the text is empty
{
Some Logic//
}
SetProperty(ref TypedText, value);
}
}
private void MyCommandExecuted(string text)
{
SearchText= string.Empty;
}
答案 0 :(得分:1)
您似乎不了解您正在使用的框架
public string SearchText
{
set
{
TypedText = value;
SetProperty(ref TypedText, value);
}
}
这两行代码应该/永远不会出现在同一代码块中。
这是怎么回事。
第一行将TypedText
设置为value
。 OKAY ...
第二行,检查TypedText
是否等于value
(扰流警报,它是),如果不是,那么将它们设置为相等,然后告诉你改变为值的WPF。
问题是,第二行从不运行其逻辑(告诉WPF我已经改变了)。从未运行的原因是第一行。
从代码中删除TypedText = value;
,它可能正常工作。
set
{
if (string.IsNullOrEmpty(value))// This is called when the text is empty
{
Some Logic//
}
SetProperty(ref TypedText, value);
}
然而,最后一件事。我真的很讨厌setter所做的代码。为什么这里有逻辑?从外部用户,它可能会做一些意想不到的事情。
答案 1 :(得分:0)
我有一个文本框,我正在处理其文本更改事件
不,你没有,或者至少没有在你的问题中显示的代码摘录中:
<TextBox Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Name="mytxtBox">
<TextBox.InputBindings>
<KeyBinding Command="{Binding Path=SearchCommand}" CommandParameter="{Binding ElementName=mytxtBox, Path=Text}" Key="Enter"/>
</TextBox.InputBindings>
</TextBox>
在此示例中,您有一个绑定到TextBox.Text
属性的字符串属性数据,该属性与处理其文本更改事件类似,但不相同。
无论哪种方式,为了清除此数据绑定值,您只需将数据绑定字符串属性设置为空字符串(从setter中删除无关代码后):
public string SearchText
{
get { return TypedText; }
set { TypedText = value; SetProperty(ref TypedText, value); }
}
...
private void MyCommandExecuted(string text)
{
SearchText = string.Empty;
}