2009-07-03 10 views
17

मैं ItemsControl(ListBox) में एक शॉपिंग कार्ट की सामग्री का प्रयास कर रहा हूं। ऐसा करने के लिए, मेरे द्वारा बनाए गए निम्न DataTemplate:डॉकपैनेल को उपलब्ध स्थान कैसे भरें

<DataTemplate x:Key="Templates.ShoppingCartProduct" 
       DataType="{x:Type viewModel:ProductViewModel}"> 
    <DockPanel HorizontalAlignment="Stretch"> 
     <TextBlock DockPanel.Dock="Left" 
        Text="{Binding Path=Name}" 
        FontSize="10" 
        Foreground="Black" /> 
     <TextBlock DockPanel.Dock="Right" 
        Text="{Binding Path=Price, StringFormat=\{0:C\}}" 
        FontSize="10" 
        Foreground="Black" /> 
    </DockPanel> 
</DataTemplate> 

आइटम मेरी खरीदारी की टोकरी हालांकि, नाम और मूल्य TextBlocks सही एक दूसरे के बगल में बैठे हैं में दिखाया जाता है, और वहाँ की एक अत्यंत बड़ी राशि है दाएं हाथ की ओर सफेद जगह।

सोच रहा था क्या सबसे अच्छा तरीका सभी ListItem द्वारा उपलब्ध कराया गया था जगह को भरने के फैलाने के लिए DockPanel मजबूर करने के लिए?

उत्तर

26

बाइंड ListBoxItem की ActualWidth को DockPanel की Width:

<DockPanel Width="{Binding ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}"> 
... 

एक अन्य विकल्प: तुम सिर्फ ItemContainerStyle को फिर से परिभाषित कर सकता है ताकि ListBoxItem क्षैतिज बढ़ाया जाता है:

<ListBox.ItemContainerStyle> 
    <Style TargetType="ListBoxItem"> 
     <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    </Style> 
</ListBox.ItemContainerStyle> 
+0

मुझे लगता है कि बंधन और यह, कारण हो करने के लिए ListBoxItem लगातार आकार में विकसित करने के लिए जब स्नूप के साथ देखने लगती उपयोग करने की कोशिश, मैंने देखा कि दोनों ListBoxItem और DockPanel की चौड़ाई से अधिक 300,000। –

+0

लिस्टबॉक्स के वास्तविक विवाद के लिए बाध्यकारी आज़माएं, फिर ... –

+2

ओह, ठीक है, मुझे यह मिल गया है ... आपको डॉकपैनल पर LastChildFill = "झूठा" सेट करना होगा, अन्यथा दूसरा टेक्स्टब्लॉक –

4

DockPanel रों बुराई है जटिल लेआउट के लिए StackPanel/DockPanel संयोजन का उपयोग करने के लिए टेम्पटेशन "लेआउट मृत सिरों" की ओर जाता है। एक ग्रिड का उपयोग करें:

<Grid> 
    <TextBlock HorizontalAlignment="Left" 
... 
    <TextBlock HorizontalAlignment="Right" 
... 
/Grid> 

मैं उपयोग Grid लगभग विशेष रूप से है, तत्वों के प्रत्येक ब्लॉक के लिए एक अलग ग्रिड का उपयोग कर कि "एक साथ हैं"

+0

मुझे नहीं लगता कि डॉकपैनल्स बुरा हैं, वे कभी-कभी बहुत उपयोगी हो सकते हैं ... हालांकि मुझे इस बात से सहमत होना चाहिए कि शायद उस मामले में यह सबसे अच्छा विकल्प नहीं था –

+0

बेशक यह व्यक्तिपरक है और वे _absolute_ बुराई नहीं हैं;) लेकिन देखो कि रिच पहले से ही जा रहा है - सरल कार्य के लिए ItemContainerStyle (अर्ध-उन्नत सामान) का उपयोग करके - थोड़े संकेतक ... –

+0

मैंने शुरुआत में ग्रिड माना था। हालांकि, एक संकीर्ण सूची बॉक्स, या नाम या मूल्य गुणों के लिए लंबे समय तक पर्याप्त मूल्य दिया गया है, दो टेक्स्टब्लॉक उनके मूल्यों को ओवरलैप कर देंगे। इसके अतिरिक्त मैं एक "जटिल लेआउट" के रूप में एक पैनल के विपरीत सिरों पर दो टेक्स्टब्लॉक को दोबारा वर्गीकृत करना चाहता हूं। –

5

गोदी पैनल के बारे में अच्छी बात यह है कि वे पहले से ही सभी उपलब्ध स्थान को भरने है । LastChildFill डिफ़ॉल्ट रूप से सत्य है (लेकिन मैंने इसे स्पष्टता के लिए नीचे सेट किया है), इसलिए बस अंतिम बच्चे पर डॉकपैनेल विशेषता सेट न करें, और यह उपलब्ध स्थान भर जाएगी।

<DockPanel HorizontalAlignment="Stretch" LastChildFill="true"> 
    <TextBlock DockPanel.Dock="Left" 
       Text="{Binding Path=Name}" 
       FontSize="10" 
       Foreground="Black" /> 
    <TextBlock 
       Text="{Binding Path=Price, StringFormat=\{0:C\}}" 
       FontSize="10" 
       Foreground="Black" /> 
</DockPanel> 
संबंधित मुद्दे