मेरे पास एक संवाद प्रकार का दृश्य प्रबंधित करने के लिए एक दृश्य मॉडल है जो एक सूची (यदि आवश्यक हो) फ़िल्टरिंग और किसी आइटम का चयन करने की अनुमति देता है। कोड ठीक काम करता है चाहे मैं IsSynchronizedWithCurrentItem को सत्य या नहीं सेट करता हूं। मेरी समझ यह है कि यह संपत्ति डिफ़ॉल्ट रूप से ListView में सत्य नहीं है, इसलिए मैं इस संपत्ति को बेहतर ढंग से समझना चाहता हूं।IsSynchronizedWithCurrentItem विशेषता और वर्तमान आइटम अपडेट
<ListView
ItemsSource="{Binding Projects.View}"
IsSynchronizedWithCurrentItem="True"
SelectedItem="{Binding SelectedProject, Mode=TwoWay}"
>
दृश्य मॉडल परियोजनाओं वास्तव में एक CollectionViewSource है कि एक निजी ObservableCollection के द्वारा समर्थित है है:
यहाँ देखने के 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 की फ़िल्टर संपत्ति हैंडलर जो सूची में दृश्य मॉडल आइटम जो बाइंडिंग द्वारा उठाया जाता है पर विभिन्न विधेय देता है: यहाँ है कि बाध्यकारी XAML से संबंधित है वी एम के संबंधित भाग है सही ढंग से। यहाँ है कि कोड का सार (जो एक ही 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;
}
मोड सेटिंग = TwoWay अनावश्यक के बाद से ListView के SelectedItem बाध्यकारी डिफ़ॉल्ट रूप से दो तरह से है, लेकिन मैं कोई आपत्ति नहीं है के बारे में स्पष्ट किया जा रहा है यह एक बार जब मैं डब्ल्यूपीएफ बेहतर समझता हूं तो मैं इसके बारे में अलग-अलग महसूस कर सकता हूं)।
मेरे कोड के बारे में क्या है IsSynchronizedWithCurrentItem = सही अनावश्यक?
मेरा आंत यह है कि यह सभ्य कोड है, लेकिन मुझे यह पसंद नहीं है कि यह टुकड़े "जादू" के माध्यम से काम कर रहे हैं, जिसका अर्थ है कि मैं किसी भी रचनात्मक प्रतिक्रिया का स्वागत करूंगा!
चीयर्स,
Berryl