从代码隐藏执行命令时未设置MVVM模型属性

时间:2014-02-19 16:11:35

标签: c# wpf mvvm

我从TextBox-KeyUp事件在我的ViewModel上执行命令。我遇到的问题是TextBox中绑定到ViewModel上的属性的文本在执行命令时仍然为null。

视图模型:

private string _myText;
public string MyText
{
    get { return _myText; }
    set 
    {
        _myText = value;
        RaisePropertyChanged("MyText");
    }
}

// ... ICommand stuff here

private object HandleMyCommand(object param)
{
    Console.WriteLine(MyText); // at this point MyText --> 'old' value, e.g. null
    return null;
}}

XAML:

<StackPannel>
    <TextBox x:Name="tbTest" KeyUp="TextBox_KeyUp" Text="{Binding MyText, Mode=TwoWay}" />
    <Button x:Name="btnTest" Content="Click" Command="{Binding MyCommand}" />
</StackPannel>

代码背后:

private void TextBox_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        if (btnTest.Command.CanExecute(null))
        {
            btnTest.Command.Execute(null);
        }
    }
}

绑定和命令都有效。以正常方式执行命令时,使用该按钮可以很好地设置属性。

我没有正确地这样做吗?

2 个答案:

答案 0 :(得分:2)

默认设置UpdateSourceTrigger=PropertyChanged MyText将在失去焦点时更新:

Text="{Binding MyText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

此外,与您的问题无关,但您可以为InputBinding创建TextBox,以便在按下 Enter 时执行某些Command

<TextBox x:Name="tbTest" Text="{Binding MyText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
    <TextBox.InputBindings>
        <KeyBinding Key="Enter" Command="{Binding MyCommand}"/>
    </TextBox.InputBindings>
</TextBox>

答案 1 :(得分:0)

尝试将text属性的绑定更改为:

Text="{Binding MyText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"