如何在MVVM中清除TextBox?

时间:2013-04-24 15:46:55

标签: wpf xaml mvvm mvvm-light

我在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中弄明白。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

如果文本是数据层和应用程序逻辑的一部分,则ModelViewModel中应存在一个字符串,并从那里清除

例如,

<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并生成方法。现在,您可以像代码隐藏事件一样处理事件。