首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制或以其他方式启动TwoWay TestBox数据绑定

强制或以其他方式启动TwoWay TestBox数据绑定
EN

Stack Overflow用户
提问于 2014-09-07 20:27:51
回答 1查看 45关注 0票数 0

我有一个WPF TextBox,它将TwoWay绑定到ViewModel属性。我还有一个ToolBar和一个Button。单击按钮时,它将在同一个command上执行一个ViewModel,该ViewModel将对TextBox绑定的属性执行一些操作。

不幸的是,Binding只在TextBox失去焦点时才将文本发送回绑定目标。然而,工具栏上的Button在单击时不具有焦点。其结果是,当Command执行时,它没有文本框中的文本,而是绑定的最后一个值。

Xaml看起来是这样的:

代码语言:javascript
复制
<DockPanel LastChildFill="True" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" >
    <ToolBarTray Background="White" DockPanel.Dock="Top">
        <ToolBar Band="1" BandIndex="1">
            <Button Command="{Binding QueryCommand}">
                <Image Source="images\media_play_green.png" />
            </Button>
        </ToolBar>
    </ToolBarTray>
    <DataGrid VerticalAlignment="Top" DockPanel.Dock="Top" Height="450" AutoGenerateColumns="True" 
              ItemsSource="{Binding}" DataContext="{Binding Results}" DataContextChanged="DataGrid_DataContextChanged"/>
    <TextBox DockPanel.Dock="Bottom" Text="{Binding Sql, Mode=TwoWay}" 
             AcceptsReturn="True" AcceptsTab="True" AutoWordSelection="True" TextWrapping="WrapWithOverflow"/>
</DockPanel>

如何使TextBox's文本绑定在按下ToolBar button时更新ToolBarbutton。在ViewModel中没有什么奇怪的事情,看起来是这样的:

代码语言:javascript
复制
public class MainViewModel : ViewModelBase
    {
        private readonly IMusicDatabase _database;

        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel(IMusicDatabase database)
        {
            _database = database;

            QueryCommand = new RelayCommand(Query);
        }

        public RelayCommand QueryCommand { get; private set; }

        private async Task QueryAndSetResults()
        {
            Results = await _database.Query(Sql);
        }

        private void Query()
        {
            QueryAndSetResults();
        }

        private IEnumerable<object> _results;
        public IEnumerable<object> Results
        {
            get
            {
                return _results;
            }
            private set
            {
                Set<IEnumerable<object>>("Results", ref _results, value);
            }
        }

        private string _sql = "SELECT * FROM this WHERE JoinedComposers = 'Traditional'";
        public string Sql
        {
            get { return _sql; }
            set
            {
                Set<string>("Sql", ref _sql, value);
            }
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-07 20:31:43

您可以使用绑定的UpdateSourceTrigger属性,将其设置为PropertyChanged使TextBox在每次文本更改时刷新绑定,而不仅仅是在失去焦点时:

代码语言:javascript
复制
<TextBox DockPanel.Dock="Bottom"
    Text="{Binding Sql, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
    AcceptsReturn="True" 
    AcceptsTab="True" 
    AutoWordSelection="True" 
    TextWrapping="WrapWithOverflow"/>

更多信息在MSDN

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

https://stackoverflow.com/questions/25714451

复制
相关文章

相似问题

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