2009-11-30 7 views
9

मेरे पास एक संवाद प्रकार का दृश्य प्रबंधित करने के लिए एक दृश्य मॉडल है जो एक सूची (यदि आवश्यक हो) फ़िल्टरिंग और किसी आइटम का चयन करने की अनुमति देता है। कोड ठीक काम करता है चाहे मैं 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

उत्तर

13

IsSynchronizedWithCurrentItem बाध्य संग्रह का डिफ़ॉल्ट CollectionView आपके नियंत्रण से SelectedItem साथ की CurrentItem सिंक करता है।

चूंकि आपने कभी भी CollectionView के CurrentItem का उपयोग नहीं किया है और आप प्रश्न में संपत्ति को सेट करने के दो बार एक ही संग्रह से जुड़ने के लिए प्रतीत नहीं होते हैं, तो इसका कोई प्रभाव नहीं पड़ता है। की


डेमो कैसे संपत्ति समन्वयित हो जाता है (XAML दर्शकों के लिए Kaxaml या XAMLPad की तरह):

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Page.Resources> 
     <x:Array x:Key="Items" Type="{x:Type sys:String}"> 
      <sys:String>Apple</sys:String> 
      <sys:String>Orange</sys:String> 
      <sys:String>Pear</sys:String> 
      <sys:String>Lime</sys:String> 
     </x:Array> 
    </Page.Resources> 
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
     <StackPanel Background="Transparent"> 
      <ListBox IsSynchronizedWithCurrentItem="True" ItemsSource="{StaticResource Items}" /> 
      <ListBox IsSynchronizedWithCurrentItem="True" ItemsSource="{StaticResource Items}" /> 
      <!-- This TextBlock binds to the CurrentItem of the Items via the "/" --> 
      <TextBlock Text="{Binding Source={StaticResource Items}, Path=/}"/> 
     </StackPanel> 
    </ScrollViewer> 
</Page> 
संबंधित मुद्दे