ViewModel中的RelayCommand:调用无权访问ViewModel中的绑定UI数据

时间:2012-01-15 15:02:07

标签: windows-phone-7 mvvm-light

我正在实现一个基本的搜索文本框 - >按钮,但我也希望用户能够按键盘/键盘上的Enter / Return键,按How to enable enter button on keyboard on wp7?

当调用RelayCommand时,我只是获取搜索文本框内容的空值。

我正在使用MVVM Light。

我有一个PhoneApplicationPage绑定到ViewModel,其属性为:

public class MainViewModel : ViewModelBase

{

private string _searchString;

public RelayCommand Search { get; private set; }
public RelayCommand<KeyEventArgs> SearchTextBoxKeyDown { get; private set; }

public string SearchString
{
    get { return _searchString; }
    set
    {
        if (_searchString != value)
        {
            _searchString = value;
            RaisePropertyChanged("SearchString");
        }
    }
}

public MainViewModel()
{
    if (IsInDesignMode)
    {
        // Code runs in Blend --> create design time data.
    }
    else
    {
        // Code runs "for real"
        SearchTextBoxKeyDown=new RelayCommand<KeyEventArgs>((e)=>
        {
            if (e.Key == Key.Enter)
            {
                // SearchString is empty here?
                Search.Execute(null);
            }
        });
        Search = new RelayCommand(() =>
        { // invokes Search with SearchString

        },
        () =>
        {
            bool isEnabled = true;
            if (string.IsNullOrWhiteSpace(SearchString)) isEnabled = false;
            return isEnabled;
        });
    }
}

View使用MVVM Light工具包在AutoComplete控件上调用KeyDown的方法(它是Telerik控件,但它看起来像TextBox,闻起来像TextBox):

                <telerikInput:RadAutoCompleteBox
                    InputScope="Search"
                    Text="{Binding SearchString,Mode=TwoWay}"
                    SuggestionsSource="{Binding MruSearchStrings}">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="KeyDown">
                            <cmd:EventToCommand x:Name="searchStringTextBoxKeyDown" Command="{Binding SearchTextBoxKeyDown, Mode=OneWay}" PassEventArgsToCommand="True">
                            </cmd:EventToCommand>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </telerikInput:RadAutoCompleteBox>

在调用的代码中,当我访问SearchString时,我只是得到null,这就是TextBox绑定的内容 - 即使我已经输入了文本。这几乎就像SearchTextBox没有将其数据发送回ViewModel以便ViewModel在事件代码中获取。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

您的ViewModel未使用TextBox中的值进行更新,因为当您按Enter键时,您仍然可以在TextBox中获得焦点。默认情况下,ViewModel将在您离开TextBox控件后更新。但是,您可以使用自定义行为更改此情况。这个对我有用  喜欢魅力:http://zoltanarvai.com/2009/07/22/binding-update-on-textbox-textchanged-event-using-behaviors/