IsSynchronizedWithCurrentItem-Attribut und das aktuelle Element aktualisiert

Ich habe ein view-Modell zu verwalten, Dialogfeld Typ der Ansicht, dass ermöglicht das filtern der Liste (wenn notwendig) und Auswahl eines Elements. Der code funktioniert gut, ob ich IsSynchronizedWithCurrentItem auf true oder nicht. Mein Verständnis ist, dass diese Eigenschaft nicht true standardmäßig in einem ListView, also würde ich gerne besser verstehen, diese Eigenschaft.

Hier ist die Bindung setup in die Ansicht xaml (die funktioniert genauso gut ohne die synch-Eigenschaft festlegen):

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

View-Modell-Projekten ist eigentlich eine CollectionViewSource, die ist gesichert durch eine private ObservableCollection. Ich glaube, ich glommed diese Idee von einem Beispiel-Projekt von Josh Smith, aber ich glaube ehrlich nicht daran erinnern, gerade jetzt. Hier ist der relevante Teil der VM, die sich auf die xaml-Bindung:

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; }

Die Filter-Eigenschaft des CollectionViewSource hat einen handler gibt verschiedene Prädikate auf die view-Modell-Elemente in der Liste, die abgeholt wird, durch die Bindungen richtig ein. Hier ist der Kern des Gesetzes (das in der gleichen 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;
    }

Einstellung des Modus= "TwoWay" ist redundant, da die ListView SelectedItem-Bindung zwei-Wege-standardmäßig, aber ich habe nichts explizit über es (ich könnte anders fühlen, darüber, dass ich einmal verstehen, WPF besser).

Was mein code macht das IsSynchronizedWithCurrentItem=True überflüssig?

Mein Bauchgefühl ist, dass dieser anständig ist code, aber ich weiß nicht wie die Stücke scheinen zu funktionieren, über die "Magie", was bedeutet, ich würde es begrüßen jede Konstruktive feedback!

Jubel

Berryl

InformationsquelleAutor Berryl | 2009-11-30
Schreibe einen Kommentar