2011-09-14 11 views
7

इस समस्या को पुन: उत्पन्न करने के लिए, उपयोगकर्ता नियंत्रण जोड़ें, नीचे xaml में पेस्ट करें और फिर विंडो में एक उदाहरण जोड़ें। अंत में विंडो के डेटाकॉन्टेक्स्ट को ADummyDataContext (नीचे भी) के उदाहरण पर सेट करेंडब्लूपीएफ डाटाग्रिड मुद्दा

जब आप पहली बार एप्लिकेशन चलाते हैं, तो आपको एक बिल्ली युक्त प्रत्येक तीन श्रेणियों के साथ ग्रिड प्राप्त करना चाहिए। यदि आप नीचे की दो श्रेणियों में से किसी एक पर क्लिक करते हैं और बिल्ली के नाम पर क्लिक करते हैं, तो नीली पंक्ति केवल बिल्ली के नाम को दिखाएगी।

हालांकि, यदि आप पहली पंक्ति पर क्लिक करते हैं और बिल्ली की पंक्ति पर क्लिक करते हैं, तो नीली पंक्ति दिखाई नहीं देगी। नोट: यह केवल पहली बार होता है जब आप एप्लिकेशन चलाते हैं। जैसे ही आप किसी अन्य बिल्ली पर क्लिक करते हैं, पहली श्रेणी में बिल्ली अपेक्षित के रूप में काम करेगी।

<UserControl x:Class="WpfUserControls.SimpleGridControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Background="#FFE46400"> 
<Grid Margin="2,2,2,2"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="26" MaxHeight="26" MinHeight="26" /> 
     <RowDefinition /> 
     <RowDefinition Height="26" MaxHeight="26" MinHeight="26" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <ToolBar Grid.Row="0"> 
     <Button Content="Button" Name="button1" VerticalAlignment="Center" Width="75" /> 
     <Button Content="Button" Name="button2" VerticalAlignment="Center" Width="75" /> 
    </ToolBar> 
    <DataGrid CanUserAddRows="False" ItemsSource="{Binding Path=KittensView}" AutoGenerateColumns="True" Grid.Row="1" HorizontalAlignment="Stretch" Name="dataGrid1" VerticalAlignment="Stretch"> 
     <DataGrid.GroupStyle> 
      <GroupStyle> 
       <GroupStyle.HeaderTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <TextBlock Text="{Binding Path=Name}" /> 
         </StackPanel> 
        </DataTemplate> 
       </GroupStyle.HeaderTemplate> 
       <GroupStyle.ContainerStyle> 
        <Style TargetType="{x:Type GroupItem}"> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="{x:Type GroupItem}"> 
            <Expander> 
             <Expander.Header> 
              <StackPanel Orientation="Horizontal"> 
               <TextBlock Text="{Binding Path=Name}" Margin="0,0,5,0"/> 
               <TextBlock Text="{Binding Path=ItemCount}"/> 
               <TextBlock Text=" Items"/> 
              </StackPanel> 
             </Expander.Header> 
             <ItemsPresenter /> 
            </Expander> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </GroupStyle.ContainerStyle> 
      </GroupStyle> 
     </DataGrid.GroupStyle> 
     <DataGrid.RowDetailsTemplate> 
      <DataTemplate> 
       <StackPanel Background="LightBlue" Orientation="Horizontal" > 
        <!-- <Image Height="32" Width="32" Source="/WpfUserControls;component/cat.png"></Image> --> 
        <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" Height ="20" Text="{Binding Path=Name}"/> 
       </StackPanel> 
      </DataTemplate> 
     </DataGrid.RowDetailsTemplate> 
    </DataGrid> 
    <StatusBar Grid.Row="2"></StatusBar> 

</Grid> 
</UserControl> 

और यहां डेटा संदर्भ वर्ग और बिल्ली का बच्चा वर्ग है।

public class ADummyDataContext 
{ 
    public List<Kitten> Kittens { get; set; } 

    public ADummyDataContext() 
    { 
     Kittens = new List<Kitten> 
         { 
          new Kitten {Color = "Orange", Name = "Alfie", Weight=6, Sex="Male"}, 
          new Kitten {Color = "Black and White", Name = "Smudge", Weight = 4, Sex="Female"}, 
          new Kitten {Color = "Grey", Name = "Charlotte", Weight = 5, Sex="Female"} 
         }; 
     KittensView = new ListCollectionView(Kittens); 
     KittensView.GroupDescriptions.Add(new PropertyGroupDescription("Weight")); 
    } 

    public ListCollectionView KittensView { get; set; } 
} 

public class Kitten 
{ 
    public string Name { get; set; } 
    public string Color { get; set; } 
    public int Weight { get; set; } 
    public string Sex { get; set; } 

} 

मुझे यह जानने में विशेष रूप से दिलचस्पी होगी कि समस्या यह है कि समस्या क्या है।

धन्यवाद

+0

इस रूप में कई की अनुमति देते हैं शायद अभ्यस्त आपकी समस्या का समाधान लेकिन अतीत में मैं लिया है सूचियों का उपयोग करते समय परेशानी, शायद सूची को एक अवलोकन करने योग्य चयन में बदलने का प्रयास करें? – Purplegoldfish

+0

भी एक बहुत अच्छा मुद्दा है। धन्यवाद :) – Ian

उत्तर

5

समस्या यह है कि DataGrid में पहला आइटम पहले से चयनित है जब वह पहली बार लोड कर रहा है। हालांकि, यह वास्तव में चयनित नहीं है, यह चयनित नहीं दिखाई देता है और समूह का विस्तार नहीं किया जाता है। लेकिन जब आप पहली बार पहली आइटम पर क्लिक करते हैं, तो DataGrid अंतर नहीं बता सकता है क्योंकि SelectedIndex पहले से ही 0 था। यह वास्तव में परेशान है और मैंने कई बार पहले इसी तरह के व्यवहार को देखा।

समाधान के लिए, आप DataGrid

<DataGrid Loaded="dataGrid1_Loaded" 
      ...> 
की Loaded घटना में पहले आइटम का चयन रद्द कर सकते हैं

ईवेंट हैंडलर: ध्यान दें कि SelectedIndex है 0

private void dataGrid1_Loaded(object sender, RoutedEventArgs e) 
{ 
    DataGrid dataGrid = sender as DataGrid; 
    dataGrid.SelectedItem = null; 
} 
+0

यह मेरे लिए इसे ठीक करता है। अजीब - मैं इसकी अपेक्षा नहीं कर रहा था, क्योंकि अगर मैंने अलग-अलग बिल्ली के बच्चे को अलग किया, तो मैंने "अल्फी" के साथ एक ही समस्या देखी, भले ही यह ग्रिड में आखिरी थी! –

+0

उत्सुक। ऐसा लगता है कि यह एक बदलाव घटना पर केवल "खींचा" या मूल्यांकन किया गया है। मेरा मतलब यह नहीं है, यह वही है जो मैं उम्मीद करता हूं कि यह वापस भूमि में जीतने के लिए था, लेकिन मुझे और जादू की उम्मीद थी :) धन्यवाद मीलेक, सप्ताहांत के लिए खुश बोनस :) – Ian

+0

@Ian: मदद करने में खुशी :) और मैं मानता हूं, यह वही नहीं है जो कोई उम्मीद करेगा .. –

0

धन्यवाद एक बहुत @ फ्रेड्रिक यहां मेरी टिप्पणी के बाद कोड है:

XAML:

<DataGrid SelectionChanged="DataGrid_SelectionChanged"> 

codebehind.cs:

private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    DataGrid dataGrid = sender as DataGrid; 
    dataGrid.SelectionChanged -= DataGrid_SelectionChanged; 
    dataGrid.SelectedItem = null; 
    dataGrid.SelectionChanged += DataGrid_SelectionChanged; 
} 

इस कोड को भी डेटा को ताज़ा करने के रूप में आप चाहते

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