强制或以其他方式启动双向测试框数据绑定
本文关键字:测试 数据绑定 启动 方式 其他 | 更新日期: 2023-09-27 18:21:04
我有一个WPF TextBox
,TwoWay
绑定到ViewModel属性。我还有一个带Button
ToolBar
.单击 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>
如何获取TextBox's
文本绑定以在按下ToolBar
button
时更新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);
}
}
}
可以使用
绑定的 UpdateSourceTrigger
属性,将其设置为 PropertyChanged
使 TextBox 在每次文本更改时刷新绑定,而不仅仅是在失去焦点时刷新绑定:
<TextBox DockPanel.Dock="Bottom"
Text="{Binding Sql, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
AcceptsReturn="True"
AcceptsTab="True"
AutoWordSelection="True"
TextWrapping="WrapWithOverflow"/>
更多信息请访问 MSDN。