Dans mon application WPF, j'ai un certain nombre de zones de texte liées aux données. L' UpdateSourceTrigger
de ces liaisons est - LostFocus
. L'objet est enregistré à l'aide du menu Fichier. Le problème que j'ai, c'est qu'il est possible d'entrer une nouvelle valeur dans une zone de texte, sélectionnez Enregistrer dans le menu Fichier, et de ne jamais persister la nouvelle valeur (celui visible dans la zone de texte), car l'accès au menu ne permet pas de supprimer le focus dans la zone de texte. Comment puis-je résoudre ce problème? Est-il un moyen de forcer tous les champs d'une page à databind?
@palehorse: Bon point. Malheureusement, j'ai besoin d'utiliser LostFocus que mon UpdateSourceTrigger afin de soutenir le type de validation que je veux.
@dmo: j'avais pensé à ça. Il semble, cependant, comme un vraiment inélégante solution est relativement simple problème. En outre, il exige qu'il y ait un certain contrôle sur la page, qui est toujours visible à recevoir le focus. Ma demande est à onglets, toutefois, donc pas de contrôle facilement se présente.
@Nidonocu: Le fait qu'en utilisant le menu n'a pas de déplacer le focus dans la zone de texte qui me confond ainsi. C'est, toutefois, le problème que je vois. L'exemple simple suivant illustre mon problème:
<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; }
}
}