我在DataTemplate中有一个TextBox,声明如下:
<TextBox Grid.Row="1" Grid.Column="1" Margin="0,4,0,0">
<i:Interaction.Triggers>
<i:EventTrigger EventName="LostFocus">
<cmd:EventToCommand Command="{Binding DataContext.NotesEnteredCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}">
<cmd:EventToCommand.CommandParameter>
<MultiBinding Converter="{StaticResource SimpleMultiValueConverter}">
<Binding Path="Row.OID" />
<Binding Path="Text" RelativeSource="{RelativeSource FindAncestor, AncestorType=TextBox}" />
</MultiBinding>
</cmd:EventToCommand.CommandParameter>
</cmd:EventToCommand>
</i:EventTrigger>
</i:Interaction.Triggers>
<TextBox.InputBindings>
<KeyBinding Key="Enter" Command="{Binding DataContext.NotesEnteredCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}">
<KeyBinding.CommandParameter>
<MultiBinding Converter="{StaticResource SimpleMultiValueConverter}">
<Binding Path="Row.OID" />
<Binding Path="Text" RelativeSource="{RelativeSource FindAncestor, AncestorType=TextBox}" />
</MultiBinding>
</KeyBinding.CommandParameter>
</KeyBinding>
</TextBox.InputBindings>
这个TextBox基本上做的是当按下Enter键或失去焦点时执行MVVM-Light RelayCommand。
我的问题是我无法在MVVM中找到一种方法,在上述两种情况下通过XAML清除TextBox的 Text 值。在代码隐藏方面很容易,但我无法在MVVM中弄明白。
有什么想法吗?
答案 0 :(得分:2)
如果文本是数据层和应用程序逻辑的一部分,则Model
或ViewModel
中应存在一个字符串,并从那里清除
例如,
<TextBox Text="{Binding NewNote}" ... />
和
void NotesEntered(int oid)
{
SaveNewNote(oid);
NewNote = string.Empty;
}
如果它只是UI层的一部分,则应该使用代码隐藏清除它。在UI后面的代码中使用特定于UI的逻辑是完全可以接受的,因为它仍然保持了层的分离。
NewNoteTextBox_LostFocus(object sender, EventArgs e)
{
(sender as TextBox).Text = string.Empty;
}
NewNoteTextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Keys.Enter)
(sender as TextBox).Text = string.Empty;
}
答案 1 :(得分:0)
您可以使用UpdateSourceHelper。这真的帮助我调用没有代码隐藏的事件。 见http://www.wiredprairie.us/blog/index.php/archives/1701
您所要做的就是创建一个“UpdateSourceHelper”类,将它与您的xaml连接起来
xmlns:local="using:WiredPrairie.Converter
并将其绑定到TextBox(或任何你想要绑定的东西)......
<TextBox Height="Auto" Margin="0,6" Grid.Row="1" TextWrapping="Wrap" TabIndex="0"
Text="{Binding Value}"
local:UpdateSourceHelper.IsEnabled="True"
local:UpdateSourceHelper.UpdateSourceText="{Binding Value, Mode=TwoWay}"/>
如果你想在Helper中调用LostFocus Event,你只需要在你的Helper中添加这两行:
tb.LostFocus += AttachedTextBoxLostFocus;
tb.LostFocus -= AttachedTextBoxLostFocus;
所以它看起来像这样:
TextBox tb = (TextBox)obj;
if ((bool)args.NewValue)
{
tb.LostFocus += AttachedTextBoxLostFocus;
}
else
{
tb.LostFocus -= AttachedTextBoxLostFocus;
}
右键单击AttachedTextBoxLostFocus并生成方法。现在,您可以像代码隐藏事件一样处理事件。