2010-09-20 7 views
9

मैं एक चेकबॉक्स है, और एक ItemsControl अंदर ElementName लिए बाइंडिंग कई datagrids निम्नलिखित तरीके से पॉप्युलेट:WPF ItemsControl

<Checkbox Content="Birthday Column Visible" x:Name="UI_BirthdayVisibleCB" /> 

<ItemsControl ItemsSource="{Binding Path=ParentsCollection}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
     <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Children}"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn Header="Birthday" Width="120" Visibility="{Binding IsChecked, ElementName=UI_BirthdayVisibleCB, Converter={StaticResource BoolToVis}}" > 
... 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
</Rest of closing tags> 

यह आउटपुट त्रुटियों बंधन के रूप में यह DataGridTemplateColumn पर IsChecked खोजने की कोशिश करता पैदा करता है। मैं अपवाद प्राप्त अगर मैं एक सापेक्ष पूर्वज के लिए खोज करने की कोशिश:

Binding.RelativeSource cannot be set while using Binding.ElementName. 

मैं एक ViewModel है, और ज्यादातर MVVM पर कायम है, लेकिन इस मामले में मैं वास्तव में देखें परत पर स्तंभ दृश्यताएं रखना चाहते हैं । ध्यान दें कि BoolToVis बस बूलियन को दृश्यता में परिवर्तित करता है।

<DataGridTemplateColumn Header="Birthday" Visibility="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyView} }, Path=IsChecked, ElementName=UI_BirthdayVisibleCB, Converter={StaticResource BoolToVis}}" /> 

यह कम्पाइल लेकिन फिर भी नहीं चलता है, यह अपवाद ऊपर फेंकता है:

संपादित

यहाँ मैं क्या कर रहा हूँ का एक उदाहरण है।

उत्तर

3

आप RelativeSource की कोशिश करना चाहते हैं, तो आप घोषणा से ElementName दूर करने के लिए है:

हालांकि, तीन गुण का केवल एक, ElementName, स्रोत, और RelativeSource, प्रत्येक के लिए सेट किया जाना चाहिए बाध्यकारी, या एक संघर्ष हो सकता है। पर बाध्यकारी स्रोत संघर्ष होने पर यह गुण अपवाद फेंकता है।

http://msdn.microsoft.com/en-us/library/system.windows.data.binding.elementname.aspx

ElementName के आपके उपयोग सही लगता है, इसलिए मैं अगर तुम RelativeSource से अधिक पसंद करते हैं कि इस समस्या को देखने के लिए जारी रखेंगे।

+0

समस्या यह है कि मुझे एलिमेंट नाम और सापेक्ष स्रोत दोनों की आवश्यकता है, क्योंकि मेरा डेटाकॉन्टेक्स्ट आइटम्स कंट्रोल के वर्तमान आइटम पर सेट है। – bufferz

+0

कोड पोस्ट करें जो कि ElementName और RelativeSource दोनों का उपयोग करता है। – McStretch

+0

ठीक है - मैंने यह दिखाने के लिए अपना प्रश्न संपादित किया कि मैं क्या करने का प्रयास कर रहा हूं। – bufferz

11

आप सापेक्ष स्रोत का उपयोग कर रहे हैं, जिसे एलिमेंटनाम के साथ मिश्रित नहीं किया जा सकता है, लेकिन एक बार जब आपके पास सही सापेक्ष स्रोत हो, तो आप पथ का उपयोग करके गहराई से ड्रिल कर सकते हैं।

उदा।

Visibility="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyView} }, Path=UI_BirthdayVisibleCB.IsChecked, Converter={StaticResource BoolToVis}}" 

शायद आप इस तरह कुछ XAML है:

<UserControl class="MyView" ... >...<CheckBox Name="UI_BirthdayVisibileCB"/> ... 

उपरोक्त RelativeSource के आधार पर प्रकार से इस UserControl खोजना चाहिए बाध्यकारी है, तो यह एक संपत्ति UI_BirthdayVisibleCB नामित है, जो इसे जीता 'की तलाश करेगा टी नहीं मिला क्योंकि WPF XAML इस नामित तत्व को फ़ील्ड के रूप में लागू करता है।

आपके कामकाज में जाने और इसके लिए संपत्ति का पर्दाफाश करना आसान काम है।

public object BirthdayVisibileCB_4_binding { 
    get { return UI_BirthdayVisibileDB; } 
} 

और इसके बजाय यह करने के लिए बाध्य:

Visibility="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type local:MyView} }, 
Path=BirthdayVisibileCB_4_binding.IsChecked, Converter={StaticResource BoolToVis}}" 

हाँ, यह एक तरह से एक दर्द ऐसा करने के लिए, लेकिन MVVM केवल WPF अब तक ... इसकी नहीं एक महान फिट, अपने ही मेल खाता है हमारे पास सबसे अच्छा फिट है।

+1

यह समस्या मुझे मिली इस समस्या का सबसे अच्छा समाधान है। एक जोड़ा बोनस यह संकलित समय सुरक्षित है –

+1

इसके लिए धन्यवाद! मैं वास्तव में एक समान मुद्दे को हल करने की कोशिश कर निराश हूं। मुझे आश्चर्य है कि डब्ल्यूपीएफ की इस तरह की निगरानी है। इसे पोस्ट करने के बाद, क्या आपको किसी अन्य समाधान का सामना करना पड़ा है? –

+0

@ हेनरी मेरियम नॉप, मुझे एक बेहतर तरीका नहीं मिला है। मैं अब भी दिन में डब्ल्यूपीएफ का उपयोग नहीं कर रहा हूं :) शुभकामनाएं। – jrwren