2010-11-05 103 views
2

我似乎無法理解這一點。WPF Datagrid排序索引問題

我創建的代碼示例演示我的問題,希望有人能告訴我答案...

的問題是,一旦數據網格進行排序,標記ID和名稱不再是選擇匹配的DataGrid項目。

我想你並欣賞...幫助

感謝

傑夫

<Window x:Class="dgSortTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="dgSortTest" Height="253" Width="403" IsEnabled="True"> 
    <Grid> 
     <DataGrid AutoGenerateColumns="False" Height="212" HorizontalAlignment="Left" Margin="12,2,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="200" SelectionChanged="dataGrid1_SelectionChanged" RowHeaderWidth="0" AreRowDetailsFrozen="False" CanUserAddRows="True" CanUserDeleteRows="True" IsReadOnly="True"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="ID" Binding="{Binding ID}"/> 
       <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
     </DataGrid.Columns> 
     </DataGrid> 
     <Label Content="Index: " Name="lblIndex" Height="28" HorizontalAlignment="Left" Margin="228,12,0,0" VerticalAlignment="Top" Width="92" /> 
     <Label Content="ID:" Name="lblID" Height="28" HorizontalAlignment="Left" Margin="228,46,0,0" VerticalAlignment="Top" Width="141" IsEnabled="True" /> 
     <Label Content="Name: " Name="lblName" Height="28" HorizontalAlignment="Left" Margin="228,80,0,0" VerticalAlignment="Top" Width="141" /> 
    </Grid> 
</Window> 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace dgSortTest 
{ 
    public partial class MainWindow : Window 
    { 
     List<Person> people = new List<Person>(); 
     public MainWindow() 
     { 
      InitializeComponent(); 
      people.Add(new Person() { ID = 0, Name = "Jeff" }); 
      people.Add(new Person() { ID = 1, Name = "Tom" }); 
      people.Add(new Person() { ID = 2, Name = "Andy" }); 
      people.Add(new Person() { ID = 3, Name = "Ken" }); 
      people.Add(new Person() { ID = 4, Name = "Zack" }); 
      people.Add(new Person() { ID = 5, Name = "Emily" }); 
      people.Add(new Person() { ID = 6, Name = "Courtney" }); 
      people.Add(new Person() { ID = 7, Name = "Adam" }); 
      people.Add(new Person() { ID = 8, Name = "Brenda" }); 
      people.Add(new Person() { ID = 9, Name = "Bill" }); 
      people.Add(new Person() { ID = 10, Name = "Joan" }); 
      dataGrid1.ItemsSource = from Person in people select Person; 
     } 

     private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      int index = dataGrid1.SelectedIndex; 
      lblIndex.Content = "Index: " + index.ToString(); 
      lblID.Content = "ID: " + people[index].ID; 
      lblName.Content = "Name: " + people[index].Name; 
     } 
    } 

    public class Person 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
    } 
} 

回答

1

您的問題和短採樣,+ 1爲好描述。

簡短的回答,不要改變你目前的大部分實現,你可以做到這一點。

private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    Person selectedItem = dataGrid1.SelectedItem as Person; 
    int index = dataGrid1.SelectedIndex; 
    lblIndex.Content = "Index: " + index.ToString(); 
    lblID.Content = "ID: " + selectedItem.ID; 
    lblName.Content = "Name: " + selectedItem.Name; 
} 

不過,我會建議你直接綁定到的SelectedItem代替。那麼你不需要EventHandler後面的代碼。

<StackPanel Orientation="Vertical" Margin="228,12,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="92" > 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="Index: "/> 
     <TextBlock Text="{Binding ElementName=dataGrid1, Path=SelectedIndex}"/> 
    </StackPanel> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="ID: "/> 
     <TextBlock Text="{Binding ElementName=dataGrid1, Path=SelectedItem.ID}"/> 
    </StackPanel> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="Name: "/> 
     <TextBlock Text="{Binding ElementName=dataGrid1, Path=SelectedItem.Name}"/> 
    </StackPanel> 
</StackPanel> 
+0

非常感謝!我必須說,第一個建議更容易理解,因爲TBO,我還不知道xaml正在發生什麼。我可以用它創建UI,但是要做大部分的代碼,沒有代碼,讓我感到困惑。我相信隨着時間的推移,我會得到它。 – 2010-11-08 13:38:23