我的场景是,在打开应用程序后,我从文件中读取了大量数据(使用XMLSerializer
)并将其放入ObservableCollection<MyClass>
。使用Bindings,我向用户提供数据。当他们更改字段中的数据时,会更新集合中的正确数据,但我不希望将这些数据保存到LostFocus
上的文件中。我有一个'SAVE'按钮。
我不想使用UpdateSOurceTrigger = PropertyChanged
,我想保留LostFocus
。问题是,当用户将数据输入TextBox
并按下保存按钮时,TextBox
不会失去焦点,这意味着数据不会传播到集合而不会保存。以下是我的解决方案,但是,我的问题是,这是一种正确的做法,还是有其他更好的方式?
我在保存收藏前添加到保存按钮的代码:
IInputElement focusedElement = Keyboard.FocusedElement;
if (focusedElement is TextBox)
{
BindingExpression myBinding = BindingOperations.GetBindingExpression((TextBox)focusedElement, TextBox.TextProperty);
myBinding.UpdateSource();
}
答案 0 :(得分:2)
以下是您的方案的一个小示例:
<Window x:Class="MementoAndLostFocus.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MementoAndLostFocus"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="10*"/>
<RowDefinition />
</Grid.RowDefinitions>
<TextBox Text="{Binding ExampleInstance.ExampleName, UpdateSourceTrigger=LostFocus}"
BorderThickness="1"
BorderBrush="Black"
VerticalAlignment="Top"
Margin="10"/>
<Button Grid.Row="1"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Content="Save"
Command="{Binding SaveCommand}"/>
</Grid>
public class MainViewModel
{
public ExampleClass ExampleInstance { get; set; }
public ICommand SaveCommand { get; set; }
public MainViewModel()
{
ExampleInstance = new ExampleClass() { ExampleName = "Example Name" };
SaveCommand = new SaveCommand(this);
}
internal void Save()
{
//TO DO - Save item to database
Console.WriteLine(ExampleInstance.ExampleName);
}
}
public class ExampleClass : INotifyPropertyChanged
{
private string _exampleName;
public string ExampleName
{
get { return _exampleName; }
set
{
PropertyChanged(this, new PropertyChangedEventArgs(nameof(ExampleName)));
_exampleName = value;
}
}
public event PropertyChangedEventHandler PropertyChanged = delegate { };
}
public class SaveCommand : ICommand
{
private MainViewModel _vm;
public event EventHandler CanExecuteChanged;
public SaveCommand(MainViewModel vm)
{
_vm = vm;
}
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
_vm.Save();
}
}
那么到底发生了什么:
如您所见,TextBox
就在那里,其UpdateSourceTrigger
设置为LostFocus
。
当我在那里修改值并单击“保存”按钮时,我能够看到发生了什么,在Save方法中有一个断点并且值已更新,因为当您单击按钮时, TextBox
失去了焦点。
无论如何,我想写这封信给你,因为还有更多的东西。
查看IEditableObject
界面:
提供向对象提交或回滚更改的功能 用作数据源。
就是这样。