В моем приложении WPF у меня есть несколько текстовых ящиков с привязкой к данным. UpdateSourceTrigger
для этих привязок LostFocus
. Объект сохраняется с помощью меню Файл. У меня проблема в том, что можно ввести новое значение в TextBox, выбрать «Сохранить» в меню «Файл» и никогда не сохранять новое значение (видимое в TextBox), поскольку доступ к меню не приводит к удалению фокуса из TextBox , Как я могу это исправить? Есть ли способ заставить все элементы управления на странице привязать данные?
@ palehorse: Хорошая мысль. К сожалению, мне нужно использовать LostFocus в качестве моего UpdateSourceTrigger для поддержки требуемого типа проверки.
@ dmo: Я думал об этом. Однако, это похоже на действительно не элегантное решение относительно простой проблемы. Кроме того, требуется, чтобы на странице был какой-то элемент управления, который всегда виден для получения фокуса. Мое приложение, однако, имеет вкладки, поэтому такой элемент управления с готовностью не представляется.
@ Nidonocu: тот факт, что использование меню не сдвинуло фокус с TextBox, смутил меня. Это, однако, поведение, которое я вижу. Следующий простой пример демонстрирует мою проблему:
<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; }
}
}