2014-09-07 2 views
0

У меня есть WPF TextBox с TwoWay, привязанным к свойству ViewModel. У меня также есть ToolBar с Button. Когда нажимается кнопка, она выполняет command на том же ViewModel, который будет делать что-то с свойством, которым привязан TextBox.Сила или другое инициирование привязки данных TwoWay TestBox

К сожалению, похоже, что 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> 

Как получить TextBox's текст привязки для обновления ViewModel когда ToolBarbutton нажата. Существует ничего фантазии происходит в 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

Вы можете использовать UpdateSourceTrigger свойство связывания, установив его на PropertyChanged делает TextBox обновления связывания каждый раз, когда изменения текста, а не только тогда, когда потеря фокуса:

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

Дополнительная информация на MSDN.

+0

Имейте в виду, что если у вас много элементов управления на одном экране, это будет удар производительности. –

Смежные вопросы