У меня есть 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
когда ToolBar
button
нажата. Существует ничего фантазии происходит в 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);
}
}
}
Имейте в виду, что если у вас много элементов управления на одном экране, это будет удар производительности. –