简体   繁体   中英

WPF. Button.IsDefault = true. Without UpdateSourceTrigger=PropertyChanged

I have many forms with a lot of textboxes. And I want to add to that forms a button with IsDefault = true . Then fill any property and press enter. If I will not set UpdateSourceTrigger=PropertyChanged on textbox, it will not see my input.

The problem is that I do not want to add UpdateSourceTrigger=PropertyChanged to each textbox , combobox , checkbox , and etc. Is there any way to trigger everything to write it's data to the source without adding UpdateSourceTrigger=PropertyChanged ?

Call the BindingExpression.UpdateSource method in the click event handler for each of the Controls (TextBox, CheckBox, etc.) that you have in your Window/UserControl, like this:

private void ButtonBase_OnClick(object sender, RoutedEventArgs e) {
    this.UpdateSourceTrigger(this);
    MessageBox.Show($"Field1: {this.vm.Field1}\nField2: {this.vm.Field2}\nField3: {this.vm.Field3}");
}

public void UpdateSourceTrigger(UIElement element) {
    if (element == null) return;

    var children = LogicalTreeHelper.GetChildren(element);
    foreach (var e in children) {
        if (e is TextBox txtBox) {
            var binding = txtBox.GetBindingExpression(TextBox.TextProperty);
            binding?.UpdateSource();
        }
        if (e is CheckBox chkBox) {
            var binding = chkBox.GetBindingExpression(CheckBox.IsCheckedProperty);
            binding?.UpdateSource();
        }

        // add other types, like ComboBox or others...
        // ...

        this.UpdateSourceTrigger(e as UIElement);
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM