Атрибут IsSynchronizedWithCurrentItem и текущие обновления объекта

У меня есть модель представления для управления диалоговым типом представления, которое позволяет фильтровать списка (при необходимости) и выбора объекта. Код хорошо работает, установил ли я IsSynchronizedWithCurrentItem на истинный или нет. Мое понимание - то, что это свойство не верно по умолчанию в ListView, таким образом, я хотел бы лучше понять это свойство.

Вот обязательная установка в xaml представления (который работает точно также без синхронизирующей установки свойства):

    <ListView  
          ItemsSource="{Binding Projects.View}" 
          IsSynchronizedWithCurrentItem="True"
          SelectedItem="{Binding SelectedProject, Mode=TwoWay}"             
                      >

Моделью Projects представления является на самом деле CollectionViewSource, который поддерживается частным ObservableCollection. Я думаю я glommed эта идея из демонстрационного проекта Josh Smith, но я честно не вспоминаю прямо сейчас. Вот соответствующая часть VM, который касается привязки xaml:

private ObservableCollection<ProjectViewModel> _projectsInternal { get; set; }
public CollectionViewSource Projects { get; set; }

private void _populateProjectListings(IEnumerable<Project> openProjects) {
    var listing = (from p in openProjects 
                   orderby p.Code.ToString()
                   select new ProjectViewModel(p)).ToList();

    foreach (var pvm in listing)
            pvm.PropertyChanged += _onProjectViewModelPropertyChanged;

    _projectsInternal = new ObservableCollection<ProjectViewModel>(listing);

    Projects = new CollectionViewSource {Source = _projectsInternal};
}

/// <summary>Property that is updated via the binding to the view</summary>
public ProjectViewModel SelectedProject { get; set; }

Свойство фильтра CollectionViewSource имеет обработчик, который возвращает различные предикаты на объектах модели представления в списке, который забран привязкой правильно. Вот суть того кода (который находится в том же ProjectSelctionViewModel):

    /// <summary>Trigger filtering of the <see cref="Projects"/> listing.</summary>
    public void Filter(bool applyFilter)
    {
        if (applyFilter)
            Projects.Filter += _onFilter;
        else
            Projects.Filter -= _onFilter;

        OnPropertyChanged<ProjectSelectionViewModel>(vm=>vm.Status);
    }

    private void _onFilter(object sender, FilterEventArgs e)
    {
        var project = e.Item as ProjectViewModel;
        if (project == null) return;

        if (!project.IsMatch_Description(DescriptionText)) e.Accepted = false;
        if (!project.IsMatch_SequenceNumber(SequenceNumberText)) e.Accepted = false;
        if (!project.IsMatch_Prefix(PrefixText)) e.Accepted = false;
        if (!project.IsMatch_Midfix(MidfixText)) e.Accepted = false;
        if (!project.IsAvailable) e.Accepted = false;
    }

Установка Mode=TwoWay избыточна, так как привязка SelectedItem ListView является двумя путями по умолчанию, но я не возражаю быть явным об этом (я мог бы чувствовать по-другому об этом, как только я понимаю WPF лучше).

Что относительно моего кода сокращает IsSynchronizedWithCurrentItem=True?

Мой пищеварительный тракт - то, что это - достойный код, но мне не нравится это, части его, кажется, работают через "волшебство", что означает, что я приветствовал бы любую конструктивную обратную связь!

С наилучшими пожеланиями,
Berryl

10
задан Berryl 30 November 2009 в 21:11
поделиться