我有一个简单的ObservableCollection列表,我使用ListCollectionView绑定到表单。
问题我想控制绑定方法。 意味着只有当我按下OK按钮时才会更改属性。
现在,如果我更改“名字”并导航,则会保存该值。
例如,如果我将“名字”更改为XXX 并导航下一个然后返回,我会看到XXX而不是x ...
这是MainWindow.xaml:
public partial class MainWindow : Window
{
private ListCollectionView view;
private PersonRepository _personRepository;
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
_personRepository = new PersonRepository();
this.DataContext = _personRepository.Persons;
view = (ListCollectionView)CollectionViewSource.GetDefaultView(this.DataContext);
}
private void BackButton_Click(object sender, RoutedEventArgs e)
{
view.MoveCurrentToPrevious();
view.Refresh();
}
private void OkButton_Click(object sender, RoutedEventArgs e)
{
}
private void NextButton_Click(object sender, RoutedEventArgs e)
{
view.MoveCurrentToNext();
}
}
和Person类是:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Age { get; set; }
public string Description { get; set; }
}
存储库是带有虚拟数据的ObservableCollection ...
我的xaml字段绑定为:Text="{Binding FirstName, UpdateSourceTrigger=Explicit}"
答案 0 :(得分:2)
您可以Person
实施IEditableObject
。然后,您可以从确定按钮拨打EndEdit
,但从其他导航按钮拨打CancelEdit
。
那就是说,我觉得这个界面不直观。
答案 1 :(得分:0)
我是通过使用BindingGroup来完成的。我会选择一个容器,例如一个GroupBox,或者只是放置编辑Person类的控件的Grid,确保容器包含所有这些控件,并确保当前Person对象是其DataContext,并在其XAML定义中指定BindingGroup。
这会导致当前Person的所有Bindings上的默认UpdateSourceTrigger从LostFocus变为Explicit。这意味着用于编辑Person对象的控件不会自动更新其绑定属性,但会等到您在BindingGroup上调用CommitEdit,这显然是按下OK按钮时的操作。正如肯特已经建议的那样,你可以在导航按钮中调用CancelEdit,以便在没有按OK的情况下保持当前Person不被更新。逻辑与IEditableObject相同,只是你不必更改Person类,而是使用BindingGroup的行为来实现你想要的。