WPF, как контролировать метод привязки ListCollectionView?
У меня есть простой список 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}"
2 ответа
Вы могли бы иметь Person
воплощать в жизнь IEditableObject
, Затем вы бы позвонили EndEdit
от кнопки ОК, но CancelEdit
от других кнопок навигации.
Тем не менее, я бы нашел этот интерфейс не интуитивно понятным.
Я бы сделал это с помощью BindingGroup. Я бы выбрал контейнер, например, GroupBox или просто Grid, в котором размещены элементы управления, которые редактируют класс Person, убедитесь, что контейнер содержит все эти элементы управления, и что текущий объект Person является его DataContext, и укажите BindingGroup в это определение XAML.
Это привело бы к тому, что значение по умолчанию UpdateSourceTrigger для всех привязок к текущей персоне изменится с LostFocus на Explicit. Это означает, что элементы управления, которые вы используете для редактирования объекта Person, не будут обновлять свои привязанные свойства автоматически, но будут ждать, пока вы не вызовете CommitEdit для BindingGroup, что, очевидно, будет то, что вы будете делать при нажатии кнопки OK. Как уже предлагал Кент, вы должны вызывать CancelEdit на кнопках навигации, чтобы не обновлять текущее лицо, если вы не нажмете OK. Логика будет такой же, как и в IEditableObject, только вам не нужно менять свой класс Person, а вместо этого использовать поведение BindingGroup для достижения того, чего вы хотите.