2

我有一个简单的 ObservableCollection 列表,我使用 ListCollectionView 绑定到表单。

在此处输入图像描述

我想控制绑定方法的问题。意味着只有当我按下确定按钮时,属性才会改变。

就像现在一样,如果我更改“名字”并导航,则保存该值。

例如,如果我将“名字”更改为 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}"

4

2 回答 2

2

你可以Person实施IEditableObject. 然后,您可以EndEditOK按钮调用,但从CancelEdit其他导航按钮调用。

也就是说,我会发现这个界面不直观。

于 2012-05-12T12:03:03.323 回答
0

我会通过使用 BindingGroup 来做到这一点。我会选择一个容器,例如 GroupBox,或者只是布置编辑 Person 类的控件的 Grid,确保容器包含所有这些控件并且当前 Person 对象是它的 DataContext,并在它是 XAML 定义。

这会导致当前 Person 的所有 Bindings 上的默认 UpdateSourceTrigger 从 LostFocus 更改为 Explicit。这意味着您用于编辑 Person 对象的控件不会自动更新其绑定属性,而是会等到您在 BindingGroup 上调用 CommitEdit,这显然是您按下 OK 按钮时将执行的操作。正如 Kent 已经建议的那样,您可以在导航按钮中调用 CancelEdit,以防止在您不按 OK 时更新当前 Person。逻辑与 IEditableObject 相同,只是您不必更改 Person 类,而是使用 BindingGroup 的行为来实现您想要的。

于 2012-05-12T15:36:57.147 回答