2010-03-11 22 views
5

मैं एक हेडर्टम्प्लेट को एक डब्ल्यूपीएफ ग्रुपबॉक्स में परिभाषित करता हूं और डाटाबेसिंग काम नहीं करता है। मुझे समझ में नहीं आता क्यों।डब्ल्यूपीएफ ग्रुपबॉक्स हेडर टेम्पलेट और डेटा बाइंडिंग

<GroupBox> 
<GroupBox.HeaderTemplate> 
      <DataTemplate> 
      <StackPanel Orientation="Horizontal" > 
       <Image Source="/PopuAssuNetApplication.UI.Control;component/Images/Members.png" Width="24" /> 
       <TextBlock VerticalAlignment="Center"> 
           <TextBlock.Text> 
             <MultiBinding StringFormat="{x:Static Member=resx:Resources.PersonsInContractGroupBox}"> 
              <Binding Path="CurrentContract.Federation" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}"> 
              </Binding> 
              <Binding Path="CurrentContract.Type" Converter="{StaticResource contractTypeConverter}" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}"> 
              </Binding> 
              <Binding Path="CurrentContract.Number" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}"> 
              </Binding> 
             </MultiBinding> 
            </TextBlock.Text> 
       </TextBlock> 
       <WpfComponent:WaitControl Margin="7,0,0,0" VerticalAlignment="Top" Width="24" Height="24" MarginCenter="4"> 
        <WpfComponent:WaitControl.Style> 
         <Style> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding Path=IsMembersOfContractBusy, UpdateSourceTrigger=PropertyChanged, ElementName=PersonsInContract}" Value="true"> 
            <Setter Property="WpfComponent:WaitControl.Visibility" Value="Visible" /> 
           </DataTrigger> 
           <DataTrigger Binding="{Binding Path=IsMembersOfContractBusy, UpdateSourceTrigger=PropertyChanged, ElementName=PersonsInContract}" Value="false"> 
            <Setter Property="WpfComponent:WaitControl.Visibility" Value="Collapsed" /> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </WpfComponent:WaitControl.Style> 
       </WpfComponent:WaitControl> 
      </StackPanel> 
       </DataTemplate> 
     </GroupBox.HeaderTemplate> 

उत्तर

1

GroupBox एक सदस्य "CurrentContract" कहा जाता है नहीं है। सबसे अधिक संभावना है, आप संबंधित ViewModel से "CurrentContract" नामक एक संपत्ति तक पहुंच बनाना चाहते हैं ?! ViewModel GroupBox के DataContext

<Binding Path="DataContext.CurrentContract.Type" Converter="{StaticResource contractTypeConverter}" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}"> 
+0

धन्यवाद।मुझे लगता है कि डिफ़ॉल्ट रूप से डेटाबेस में, wpf हमेशा DataContext प्रॉपर्टी से डेटा प्राप्त करता है। डेटामैप्लेट में नहीं लगता है। – Coolweb

+1

या वैकल्पिक रूप से आप अपने समूहबॉक्स घोषणा में शीर्षलेख = "{बाइंडिंग}" जैसे कुछ कर कर डेटाकॉन्टेक्स्ट को हेडर पर बाध्य कर सकते हैं। इस तरह आपका डेटा टेम्पलेट काम करेगा। अधिक जानकारी के लिए मेरा उत्तर देखें। – jpierson

1

सबक ऊपर सीखा DataTemplates के लिए सामान्य रूप में उपयोगी है है, तो आप कुछ की तरह करने के लिए बाध्यकारी पथ को बदलने के लिए है ..., लेकिन मैं वास्तव में पता चला हाल ही में वहाँ एक बेहतर तरीका है समूहबॉक्स के शीर्षलेख को बदलने के लिए:

<GroupBox> 
    <GroupBox.Header> 
     <CheckBox IsChecked="{Binding Path=mSomeBoolean}"/> 
    </GroupBox.Header> 
</GroupBox> 

इस तरह बाइंडिंग में एक सापेक्ष स्रोत को परिभाषित करने की आवश्यकता नहीं है।

कृपया ग्रुपबॉक्स और हेडर के साथ this issue नोट करें।

+0

शीर्षलेख संपत्ति पर सीधे दृश्य सामग्री सेट करना ठीक काम करता है लेकिन हेडर टेम्पलेट से बचने का कोई कारण नहीं है यदि आप समझते हैं कि यह कैसे काम करता है। कृपया एक स्पष्टीकरण के लिए मेरा जवाब देखें। – jpierson

21

समस्या यह है कि HeaderTemplateHeaderTemplate अपने DataContext भीतर इस प्रकार हैडर templating के लिए प्रयोग किया जाता है आप जो कुछ भी बाँध या अपने GroupBox की Header संपत्ति को सौंपते हैं।

नियंत्रण के शीर्षलेख के लिए DataContext की तरह Header संपत्ति के बारे में सोचें। आम तौर पर DataContext संपत्ति अपने माता-पिता से मूल्य को कम करती है लेकिन चूंकि प्रत्येक नियंत्रण में Header नहीं होता है, तब तक हेडर खाली होता है जब तक आप इसे सेट नहीं करते।

अपने शीर्षलेख को वर्तमान डेटाकॉन्टेक्स्ट Header="{Binding}" पर बाध्यकारी करके अपने उदाहरण को काम करने के लिए काम करना चाहिए। यह वर्णन करने में सहायता के लिए कि यह कैसे काम करता है मैंने नीचे एक साधारण उदाहरण बनाया है जो दर्शाता है कि कैसे Header और DataContext नियंत्रण के शरीर या हेडर को डेटा प्रदान करने के लिए स्वतंत्र रूप से एक-दूसरे से काम करते हैं।

<GroupBox Header="HEADER TEXT" DataContext="BODY TEXT"> 
    <GroupBox.HeaderTemplate> 
     <DataTemplate> 
      <Button Content="{Binding}" 
        Background="LightGreen" /> 
     </DataTemplate> 
    </GroupBox.HeaderTemplate> 

    <CheckBox HorizontalAlignment="Center" 
       VerticalAlignment="Center" Content="{Binding}" /> 
</GroupBox> 

यह एक GroupBox कि निम्नलिखित की तरह लग रहा निकलेगा।

GroupBox with templated header

मुझे लगता है कि databinding में डिफ़ॉल्ट, WPF हमेशा DataContext प्रॉपर्टी का डेटा हो जाता द्वारा। लगता नहीं datatemplate

में आपका धारणा DataContext के बारे में सही है और यह के रूप में मैं प्रदर्शन किया है यह है कि अभी हैडर के टेम्पलेट में है DataContext हैडर संपत्ति और नहीं DataContext से ही मूल्य है DataTemplate में काम करता है।

+2

+1, यह जानकारी वास्तव में समूह बॉक्स में हेडर कैसे काम करती है इसके साथ मदद करता है! – Mas

+0

ध्यान दें कि ये अवलोकन सामान्य रूप से किसी भी HeaderedContentControl के लिए भी सच में रहते हैं। – jpierson

+0

इस उत्तर से सबसे महत्वपूर्ण लेना यह है कि यदि आप हेडर टेम्पलेट का उपयोग करने जा रहे हैं तो आपको हेडर = "{बाइंडिंग}" सेट करने की आवश्यकता है। – stricq

3
<GroupBox > 
     <GroupBox.HeaderTemplate> 
      <DataTemplate> 
        <RadioButton Content="myR" 
          IsChecked="{Binding rIsChecked, Mode=TwoWay}" 
          DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}}" /> 
      </DataTemplate> 
     </GroupBox.HeaderTemplate> 
     <GroupBox.Content> 
      <Grid IsEnabled="{Binding rIsChecked}"> 
      </Grid> 
     </GroupBox.Content> 
    </GroupBox> 

बस DataTemplate सामग्री के लिए GroupBox डीसी प्रचार ... एक आकर्षण की तरह काम करता ...

+0

यह सबसे आसान है, मुझे लगता है। धन्यवाद। –

0

यह वही मेरे लिए काम किया है:

<HeaderedContentControl Header="{Binding}" Style="{StaticResource TallHeaderedContentStyle}"> 
    <HeaderedContentControl.HeaderTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding Path=HeaderText"} /> 
    </DataTemplate> 
    </HeaderedContentControl.HeaderTemplate> 
संबंधित मुद्दे