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
Du musst angemeldet sein, um einen Kommentar abzugeben.
IsSynchronizedWithCurrentItem
synchronisiert dieCurrentItem
der Standard -CollectionView
der gebundene Sammlung mit derSelectedItem
Ihrer Kontrolle.Da Sie nie die
CurrentItem
desCollectionView
und Sie erscheinen nicht zum binden an die gleiche Sammlung zweimal in der Einstellung der Eigenschaft in Frage, hat keine sichtbaren Auswirkungen.Demo von, wie die Eigenschaft synchronisiert (für XAML-Viewer wie Kaxaml oder XAMLPad):