首页 文章

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

提问于
浏览
0

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

不幸的是,当 TextBox 失去焦点时, Binding 只会将文本发送回绑定目标 . 但是,单击工具栏上的 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);
            }
        }
    }

1 回答

  • 1

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

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

    更多信息,请致电MSDN .

相关问题