当用户按下组合键进行保存 (Ctrl-S) 时,我想将每次活动的 TextBox 的内容写回 ViewModel 的绑定属性。
我的问题是,我无法触发绑定的执行,以便绑定的 Text-Property 反映 TextBox 的内容。
- 似乎没有 GetBinding 方法。因此我无法获取绑定并手动执行它。
-在执行绑定的 WinForms 中没有 Validate-method -
从 KeyDown 中将焦点转移到另一个控件似乎不起作用,绑定不执行
我怎样才能做到这一点?
当用户按下组合键进行保存 (Ctrl-S) 时,我想将每次活动的 TextBox 的内容写回 ViewModel 的绑定属性。
我的问题是,我无法触发绑定的执行,以便绑定的 Text-Property 反映 TextBox 的内容。
- 似乎没有 GetBinding 方法。因此我无法获取绑定并手动执行它。
-在执行绑定的 WinForms 中没有 Validate-method -
从 KeyDown 中将焦点转移到另一个控件似乎不起作用,绑定不执行
我怎样才能做到这一点?
看看 Aaron 在他的 WiredPrarie 博客文章中对此的讨论:http: //www.wiredprairie.us/blog/index.php/archives/1701
我想我现在更好地理解了你的问题。解决此问题的一种方法是使用带有新属性的子类文本框,如下所示:
public class BindableTextBox : TextBox
{
public string BindableText
{
get { return (string)GetValue(BindableTextProperty); }
set { SetValue(BindableTextProperty, value); }
}
// Using a DependencyProperty as the backing store for BindableText. This enables animation, styling, binding, etc...
public static readonly DependencyProperty BindableTextProperty =
DependencyProperty.Register("BindableText", typeof(string), typeof(BindableTextBox), new PropertyMetadata("", OnBindableTextChanged));
private static void OnBindableTextChanged(DependencyObject sender, DependencyPropertyChangedEventArgs eventArgs)
{
((BindableTextBox)sender).OnBindableTextChanged((string)eventArgs.OldValue, (string)eventArgs.NewValue);
}
public BindableTextBox()
{
TextChanged += BindableTextBox_TextChanged;
}
private void OnBindableTextChanged(string oldValue, string newValue)
{
Text = newValue ? ? string.Empty; // null is not allowed as value!
}
private void BindableTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
BindableText = Text;
}
}
然后绑定到BindableText
属性。
命令实例
的解决方案这是我发现的一个相对轻量级的解决方案,但也有点“hackish”:
btn.Focus(Windows.UI.Xaml.FocusState.Programmatic);
Dispatcher.ProcessEvent(CoreProcessEventsOption.ProcessAllIfPresent);
btn.Command.Execute(null);
首先,我将焦点放在另一个控件(在我的例子中是具有绑定命令的按钮)。然后我给系统时间来执行绑定,最后我提出绑定到按钮的命令。
没有绑定命令的解决方案
将焦点交给另一个控件并调用 Dispatcher.ProcessEvent(...)。
anotherControl.Focus(Windows.UI.Xaml.FocusState.Programmatic);
Dispatcher.ProcessEvent(CoreProcessEventsOption.ProcessAllIfPresent);
// Do your action here, the bound Text-property (or every other bound property) is now ready, binding has been executed
另请参阅 BStateham 的解决方案。
这是解决问题的另一种方法