【问题标题】:Force or otherwise initiate TwoWay TestBox data binding强制或以其他方式启动双向文本框数据绑定
【发布时间】:2014-09-07 20:27:51
【问题描述】:

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

不幸的是,Binding 似乎仅在 TextBox 失去焦点时将文本发送回绑定目标。但是,工具栏上的 Button 在单击时不会获得焦点。结果是当Command 执行时,它没有来自文本框中的文本,而是最后一个绑定的值。

Xaml 看起来像这样:

<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>

当按下ToolBar button 时,如何获取TextBox's 文本绑定以更新ViewModel。 ViewModel 中没有什么花哨的东西,看起来像这样:

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);
            }
        }
    }

【问题讨论】:

    标签: c# wpf xaml mvvm data-binding


    【解决方案1】:

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

    <TextBox DockPanel.Dock="Bottom"
        Text="{Binding Sql, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
        AcceptsReturn="True" 
        AcceptsTab="True" 
        AutoWordSelection="True" 
        TextWrapping="WrapWithOverflow"/>
    

    更多信息请访问MSDN

    【讨论】:

    • 请记住,如果您在同一屏幕上有很多控件,这将影响性能。
    猜你喜欢
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 2013-09-28
    • 2019-11-26
    相关资源
    最近更新 更多