WPF如何控制ListCollectionView绑定方法?

时间:2012-05-12 10:45:12

标签: wpf binding listcollectionview

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

enter image description here

问题我想控制绑定方法。 意味着只有当我按下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}"

2 个答案:

答案 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的行为来实现你想要的。