2011-10-10 15 views
45

नेट 3.5बाइंड datagrid स्तंभ दृश्यता MVVM

मुझे पता है कि कॉलम DataContext वारिस नहीं है और अन्य पदों मैंने सोचा पढ़कर इस काम करेगा:

Visibility="{Binding RelativeSource={x:Static RelativeSource.Self}, 
        Path=(FrameworkElement.DataContext).IsColumnNameVisible, 
        Converter={StaticResource boolToVisConverter}}" 

हालांकि निश्चित रूप से ऐसा नहीं ' टी .. आउटपुट विंडो शिकायत नहीं करती है, ऐसा लगता है कि मुझे मिला संसाधन, लेकिन व्यूमोडेल संपत्ति को नया कहा जाता है।

इस पूरी डीजी है:

<tk:DataGrid           
      VirtualizingStackPanel.IsVirtualizing="False"           
      Grid.Column="0" 
      AlternationCount="2" 
      AreRowDetailsFrozen="True" 
      AutoGenerateColumns="False" 
      Background="Transparent" 
      BorderThickness="0" 
      CanUserAddRows="False" 
      CanUserReorderColumns="True" 
      CanUserResizeRows="False" 
      GridLinesVisibility="None" 
      ItemsSource="{Binding Employees}" 
      SelectionMode="Single" 
      ColumnHeaderStyle="{StaticResource columnHeaderStyle}" 
      RowHeaderStyle="{StaticResource rowHeaderStyle}" 
      CellStyle="{StaticResource cellStyle}" 
      RowStyle="{StaticResource rowStyle}" 
      ContextMenu="{StaticResource columnHeaderContextMenu}"> 
    <tk:DataGrid.Resources> 
     <ContextMenu x:Key="columnHeaderContextMenu" ItemsSource="{Binding ColumnHeaderContextMenuItems}" /> 
     <Style TargetType="{x:Type ScrollBar}"> 
      <Setter Property="Background" Value="Transparent"/> 
     </Style>          
     <Style TargetType="{x:Type tk:DataGridColumnHeader}"> 
      <Setter Property="Background" Value="Transparent"/> 
     </Style> 
    </tk:DataGrid.Resources> 
    <tk:DataGrid.Triggers> 
     <EventTrigger RoutedEvent="tk:DataGridRow.MouseDoubleClick"> 
      <EventTrigger.Actions> 
       <BeginStoryboard Storyboard="{StaticResource showDetailGrid}"/> 
      </EventTrigger.Actions> 
     </EventTrigger> 
    </tk:DataGrid.Triggers> 
    <tk:DataGrid.Columns> 
     <tk:DataGridTextColumn IsReadOnly="True" Header="test" Binding="{Binding Name, Mode=OneWay}" Visibility="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(FrameworkElement.DataContext).IsColumnNameVisible, Converter={StaticResource boolToVisConverter}}" /> 
    </tk:DataGrid.Columns> 
</tk:DataGrid> 

मैं इस समस्या को और कुछ भी नहीं काम करता है के लिए काफी हर एक समाधान पढ़ा है ..

+0

यदि आपका प्रश्न थोड़ा अस्पष्ट लगता है। क्या आप बस एक बाउंड व्यूमोडेल संपत्ति के आधार पर डेटा कॉलम को दृश्यमान या अदृश्य बनाने की कोशिश कर रहे हैं? – ChrisBD

+0

आप अपना कॉन्टेक्स्टमेनू '' में बदलते हैं - इसमें कोई आश्चर्य नहीं कि आपकी विंडो डेटाकॉन्टेक्स्ट पहुंच योग्य नहीं है। –

+0

@ क्रिसबीडी: हाँ यह विचार है। वीएम प्रोप डेटाकॉन्टेक्स्ट के माध्यम से सेट किया गया है। – jrb

उत्तर

95

DataGridColumn दृश्य पेड़ का हिस्सा है ताकि वे जुड़े हुए नहीं हैं नहीं हैं DataGrid के डेटा संदर्भ के लिए।

उनके लिए से कनेक्ट एक साथ इस तरह प्रॉक्सी तत्व दृष्टिकोण का उपयोग करें ...

  1. अपने पूर्वज पैनल की Resources में एक प्रॉक्सी FrameworkElement जोड़ें।
  2. इसे अदृश्य ContentControl में अपने Content पर होस्ट करें।
  3. अपनी दृश्यता बाध्यकारी में डेटा संदर्भ स्रोत के लिए StaticResource के रूप में इस ProxyElement का उपयोग करें।

    <StackPanel> 
        <StackPanel.Resources> 
         <local:BooleanToVisibilityConverter 
           x:Key="BooleanToVisibilityConverter" /> 
    
         <FrameworkElement x:Key="ProxyElement" 
             DataContext="{Binding}"/> 
        </StackPanel.Resources> 
        <ContentControl Visibility="Collapsed" 
           Content="{StaticResource ProxyElement}"/> 
        <DataGrid AutoGenerateColumns="False"> 
         <DataGrid.Columns> 
          <DataGridTextColumn 
            Visibility="{Binding DataContext.IsTextColumnVisibile, 
                 Source={StaticResource ProxyElement}, 
                 Converter={StaticResource 
                  BooleanToVisibilityConverter}}" 
            Binding="{Binding Text}"/> 
         </DataGrid.Columns> 
        </DataGrid> 
    </StackPanel> 
    
DataGridColumn से

अलावा, ऊपर दृष्टिकोण भी कनेक्ट करने के लिए DataContextPopup करने और ContextMenu रों (अर्थात किसी भी तत्व है कि दृश्य पेड़ से जुड़ा नहीं है) अच्छा काम करता है।

सिल्वरलाइट उपयोगकर्ता

दुर्भाग्य से स्थापित करने के लिए किसी भी ढांचे तत्वों के साथ सामग्री नियंत्रण की सामग्री को Silverlight में अनुमति नहीं है। तो वैकल्पिक हल होगा (इस Silverlight के लिए सिर्फ एक मार्गदर्शन कोड है) ...

  1. बदलें कुछ करने के लिए ढांचा तत्व संसाधन एक Textblock चाहते हल्के। (Silverlight FrameworkElement प्रकार के स्थिर संसाधन निर्दिष्ट करने की अनुमति नहीं है।)

    <StackPanel.Resources> 
        <TextBlock x:Key="MyTextBlock" /> 
    
  2. एक संलग्न संपत्ति सामग्री नियंत्रण के खिलाफ पाठ खंड धारण करने के लिए लिखें।

    <ContentControl Visibility="Collapsed" 
           local:MyAttachedBehavior.ProxyElement="{StaticResource MyTextBlock}" /> 
    
  3. संलग्न निर्भरता संपत्ति बदली हुई ईवेंट हैंडलर में, बाँध पाठ ब्लॉक के लिए सामग्री नियंत्रण से डेटा संदर्भ निर्धारित किया है।

तो इस तरह से TextBlock दृश्य पेड़ से नहीं जोड़ा जा सकता है, लेकिन शायद डेटा संदर्भ परिवर्तन के बारे में पता किया जाएगा।

उम्मीद है कि इससे मदद मिलती है।

+0

अचयनित और संशोधित करते समय एक निष्पादन प्राप्त करें: निर्दिष्ट तत्व पहले से ही किसी अन्य तत्व का तार्किक बच्चा है। इसे पहले डिस्कनेक्ट करें। क्या आप जानते हैं क्यों? – jrb

+0

आपका 'संदर्भमेनू' हो सकता है ... यह केवल एक माता-पिता से जुड़ा जा सकता है। –

+0

ने कॉन्टेक्स्टमेनू को डेटाग्रिड सीएम में बदल दिया डीजी कॉलमहेडर सीएम नहीं, लेकिन इससे मदद नहीं मिली। यदि यह मायने रखता है तो मैं इसे एकाधिक कॉलम पर उपयोग करता हूं .. – jrb

संबंधित मुद्दे