2010-02-06 21 views
9

में समूहित आइटमों का योग प्रदर्शित करें मैं एमवीवीएम डिज़ाइन पैटर्न का उपयोग करके एक WPF टाइमकार्ड ऐप बना रहा हूं, और मैं प्रत्येक दिन समूहित किए गए योग (कुल) घंटे प्रदर्शित करने की कोशिश कर रहा हूं। मेरे पास निम्नलिखित XAML का उपयोग करके समूहों में विभाजित सभी टाइमकार्ड डेटा के साथ एक सूची दृश्य है:ListView

<ListView.GroupStyle> 
    <GroupStyle ContainerStyle="{StaticResource GroupItemStyle}"> 
     <GroupStyle.HeaderTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="{Binding Path=Name, StringFormat=\{0:D\}}" FontWeight="Bold"/> 
        <TextBlock Text=" (" FontWeight="Bold"/> 
        <!-- This needs to display the sum of the hours --> 
        <TextBlock Text="{Binding ???}" FontWeight="Bold"/> 
        <TextBlock Text=" hours)" FontWeight="Bold"/> 
       </StackPanel> 
      </DataTemplate> 
     </GroupStyle.HeaderTemplate> 
    </GroupStyle> 
</ListView.GroupStyle> 

क्या यह भी संभव है? पहले मैंने सोचा कि मैं CollectionViewGroup का आंशिक वर्ग बनाउंगा और अपनी खुद की संपत्तियां जोड़ूंगा। लेकिन मुझे यकीन नहीं है कि यह भी काम करेगा। शायद एक बेहतर समाधान है ... कोई सुझाव?

उत्तर

17

e.tadeu क्या कहा, आप में से आइटम संपत्ति के लिए अपने HeaderTemplate के DataTemplate बाध्य कर सकते हैं पर विस्तार करने के लिए संग्रह दृश्य समूह। यह आपको मौजूदा समूह में मौजूद सभी आइटम वापस कर देगा।

फिर आप एक कनवर्टर की आपूर्ति कर सकते हैं जो आपको आइटम के उस संग्रह से वांछित डेटा वापस कर देगा। आपके मामले में, आप कहते हैं कि आप घंटों की राशि चाहते हैं। तो फिर आप अपने डेटा टेम्पलेट पर इस कनवर्टर इस्तेमाल कर सकते हैं

public class GroupHoursConverter : IValueConverter 
{ 

    public object Convert(object value, System.Type targetType, 
          object parameter, 
          System.Globalization.CultureInfo culture) 
    { 
     if (null == value) 
      return "null"; 

     ReadOnlyObservableCollection<object> items = 
       (ReadOnlyObservableCollection<object>)value; 

     var hours = (from i in items 
        select ((TimeCard)i).Hours).Sum(); 

     return "Total Hours: " + hours.ToString(); 
    } 

    public object ConvertBack(object value, System.Type targetType, 
           object parameter, 
           System.Globalization.CultureInfo culture) 
    { 
     throw new System.NotImplementedException(); 
    } 
} 

:

<Window.Resources> 
     <local:GroupHoursConverter x:Key="myConverter" /> 
    </Window.Resources> 

    <ListView.GroupStyle> 
     <GroupStyle ContainerStyle="{StaticResource GroupItemStyle}"> 
      <GroupStyle.HeaderTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding Path=Name, 
                StringFormat=\{0:D\}}" 
            FontWeight="Bold"/> 
         <TextBlock Text=" (" FontWeight="Bold"/> 
         <!-- This needs to display the sum of the hours --> 
         <TextBlock Text="{Binding Path=Items, 
             Converter={StaticResource myConverter}}" 
            FontWeight="Bold"/> 
         <TextBlock Text=" hours)" FontWeight="Bold"/> 
        </StackPanel> 
       </DataTemplate> 
      </GroupStyle.HeaderTemplate> 
     </GroupStyle> 
    </ListView.GroupStyle> 

चीयर्स आप एक कनवर्टर ऐसा ही कुछ करता है को लागू सकता है!

+0

धन्यवाद! मैं हमेशा उन सभी चीजों को भूल जाता हूं जो आप w/ValueConverters कर सकते हैं। नमूना कोड के लिए धन्यवाद। – Brent

+0

मान बदलते हैं तो यह काम नहीं करेगा। –

1

एक कनवर्टर का उपयोग करें।

देखें:

http://www.codeproject.com/KB/WPF/WPFAggregateConverter.aspx

यह आपको भी मदद कर सकता है:

http://www.codeproject.com/KB/WPF/DsxGridCtrl.aspx

+0

धन्यवाद ... हालांकि आपके द्वारा दिए गए उत्तर भी सही थे, मैंने इसे कोड के कारण नाथनएडब्ल्यू को देने का फैसला किया क्योंकि यह सीधे मेरे समाधान में फिट हुआ था। – Brent

-1

इस tutorial on ListView grouping प्रति आइटमों की वर्तमान गणना दिखाने के लिए बस समूह स्टाइल में "आइटमकाउंट" का उपयोग करें।