首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ViewModel中的RelayCommand :调用无权访问ViewModel中绑定的UI数据

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

Stack Overflow用户
提问于 2012-01-15 23:02:07
回答 1查看 907关注 0票数 2

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

当RelayCommand被调用时,我只得到搜索文本框内容的空值。

我使用的是MVVM Light。

我有一个绑定到具有以下属性的ViewModel的PhoneApplicationPage:

代码语言:javascript
运行
复制
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工具包在AutoComplete控件(它是一个Telerik控件,但它看起来像TextBox,闻起来像TextBox)上调用KeyDown的方法:

代码语言:javascript
运行
复制
                <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在事件代码中拾取一样。

我做错了什么?

EN

Stack Overflow用户

回答已采纳

发布于 2012-01-16 00:39:07

您的ViewModel不会使用来自TextBox的值进行更新,因为当您按Enter键时,TextBox中仍有焦点。默认情况下,在您离开TextBox控制之后,ViewModel将被更新。但是,您可以通过使用自定义行为来更改这种情况。这个对我来说非常有效:http://zoltanarvai.com/2009/07/22/binding-update-on-textbox-textchanged-event-using-behaviors/

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8870660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档