RelayCommand во ViewModel: вызов не имеет доступа к связанным данным пользовательского интерфейса в ViewModel - PullRequest
2 голосов
/ 15 января 2012

Я реализую кнопку основного текстового поля поиска ->, но я также хочу, чтобы пользователь мог нажимать клавишу Enter / Return на клавиатуре / клавиатуре, согласно Как включить кнопку ввода наклавиатура на 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;
        });
    }
}

Представление использует набор инструментов MVVM Light для вызова метода KeyDown в элементе управления AutoComplete (это элемент управления 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>

В вызываемом коде я просто получаю значение NULL при доступе к SearchString, с чем связан TextBox - даже если у меня естьвведенный текст в это.Это похоже на то, как будто SearchTextBox не отправил свои данные обратно в ViewModel для ViewModel, чтобы найти в коде события.

Что я делаю не так?

1 Ответ

2 голосов
/ 15 января 2012

Ваша ViewModel не обновляется со значением из TextBox, потому что когда вы нажимаете Enter, у вас все еще есть фокус в TextBox. По умолчанию ViewModel будет обновляться после того, как вы покинете элемент управления TextBox. Однако вы можете изменить эту ситуацию с помощью пользовательского поведения. Этот работает для меня как шарм: http://zoltanarvai.com/2009/07/22/binding-update-on-textbox-textchanged-event-using-behaviors/

...