【发布时间】:2015-08-15 03:06:45
【问题描述】:
要求
我想要ComboBox,用户可以在其中输入一些文本或从下拉列表中选择文本。当用户在键入后按 Enter 或从下拉列表中简单地选择项目时,应更新绑定源(在我的情况下为最佳视图行为)。
问题
- 如果设置了
UpdateSourceTrigger=PropertyChange(默认),那么在每个字符之后都会触发源更新,这不好,因为属性设置器调用很昂贵; - 如果设置了
UpdateSourceTrigger=LostFocus,那么从下拉列表中选择项目将需要再执行一次操作才能真正失去焦点,这对用户不太友好(需要在单击后再次单击以选择项目)。
我尝试使用UpdateSourceTrigger=Explicit,但效果不佳:
<ComboBox IsEditable="True" VerticalAlignment="Top" ItemsSource="{Binding List}"
Text="{Binding Text, UpdateSourceTrigger=LostFocus}"
SelectionChanged="ComboBox_SelectionChanged"
PreviewKeyDown="ComboBox_PreviewKeyDown" LostFocus="ComboBox_LostFocus"/>
public partial class MainWindow : Window
{
private string _text = "Test";
public string Text
{
get { return _text; }
set
{
if (_text != value)
{
_text = value;
MessageBox.Show(value);
}
}
}
public string[] List
{
get { return new[] { "Test", "AnotherTest" }; }
}
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count > 0)
((ComboBox)sender).GetBindingExpression(ComboBox.TextProperty).UpdateSource();
}
private void ComboBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
if(e.Key == Key.Enter)
((ComboBox)sender).GetBindingExpression(ComboBox.TextProperty).UpdateSource();
}
private void ComboBox_LostFocus(object sender, RoutedEventArgs e)
{
((ComboBox)sender).GetBindingExpression(ComboBox.TextProperty).UpdateSource();
}
}
此代码有 2 个问题:
- 当从下拉菜单中选择项目时,源会更新为以前选择的值,为什么?
- 当用户开始输入内容然后单击下拉按钮从列表中选择内容时 - 源再次更新(由于焦点丢失?),如何避免这种情况?
我有点害怕落入XY problem,这就是为什么我发布原始要求(也许我走错方向了?)而不是要求帮助我解决上述问题之一。
【问题讨论】: