En mi aplicación WPF, tengo una cantidad de TextBoxes enlazados a datos. El UpdateSourceTrigger
para estas fijaciones es LostFocus
. El objeto se guarda utilizando el menú Archivo. El problema que tengo es que es posible ingresar un nuevo valor en un TextBox, seleccionar Guardar en el menú Archivo y nunca insistir en el nuevo valor (el visible en el TextBox) porque al acceder al menú no se elimina el foco del TextBox . ¿Cómo puedo arreglar esto? ¿Hay alguna manera de forzar todos los controles en una página para que se vinculen?WPF Databind Before Saving
@palehorse: Buen punto. Lamentablemente, necesito usar LostFocus como UpdateSourceTrigger para admitir el tipo de validación que deseo.
@dmo: Había pensado en eso. Parece, sin embargo, como una solución realmente poco elegante para un problema relativamente simple. Además, requiere que haya algún control en la página que siempre esté visible para recibir el foco. Sin embargo, mi aplicación tiene pestañas, por lo que este control no se presenta fácilmente.
@Nidonocu: El hecho de que usar el menú no movió el foco del TextBox me confundió también. Ese es, sin embargo, el comportamiento que estoy viendo. El siguiente ejemplo demuestra mi problema:
<Window x:Class="WpfApplication2.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<ObjectDataProvider x:Key="MyItemProvider" />
</Window.Resources>
<DockPanel LastChildFill="True">
<Menu DockPanel.Dock="Top">
<MenuItem Header="File">
<MenuItem Header="Save" Click="MenuItem_Click" />
</MenuItem>
</Menu>
<StackPanel DataContext="{Binding Source={StaticResource MyItemProvider}}">
<Label Content="Enter some text and then File > Save:" />
<TextBox Text="{Binding ValueA}" />
<TextBox Text="{Binding ValueB}" />
</StackPanel>
</DockPanel>
</Window>
using System;
using System.Text;
using System.Windows;
using System.Windows.Data;
namespace WpfApplication2
{
public partial class Window1 : Window
{
public MyItem Item
{
get { return (FindResource("MyItemProvider") as ObjectDataProvider).ObjectInstance as MyItem; }
set { (FindResource("MyItemProvider") as ObjectDataProvider).ObjectInstance = value; }
}
public Window1()
{
InitializeComponent();
Item = new MyItem();
}
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(string.Format("At the time of saving, the values in the TextBoxes are:\n'{0}'\nand\n'{1}'", Item.ValueA, Item.ValueB));
}
}
public class MyItem
{
public string ValueA { get; set; }
public string ValueB { get; set; }
}
}
Esta solución solo funciona para TextBox. ¿Hay alguna manera de hacerlo funcionar para cualquier control? –