2012-08-14 41 views
1

我有这个数据网格避免datacontext中的匿名类型?

<DataGrid Grid.Row="3" Name="DataGrid6S" AutoGenerateColumns="False" VerticalScrollBarVisibility="Auto"> 
    <DataGrid.Columns> 
    <DataGridTextColumn Header="ID" Width="50" Binding="{Binding ID}" Visibility="Collapsed"></DataGridTextColumn> 
     <DataGridTextColumn Header="Name" Width="200" Binding="{Binding Name}"></DataGridTextColumn> 
     <DataGridTextColumn Header="Text" Width="200" Binding="{Binding Text}"></DataGridTextColumn> 
     <DataGridTemplateColumn Header="Edit" Width="*"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Button Click="Button_Click" >View Details</Button> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

这是由下面的代码填入:

class Test { 
     public int W { get; set; } 
     public string X { get; set; } 
     public string Y { get; set; } 
    } 

public partial class MainWindow : Window { 
    public MainWindow() { 
     InitializeComponent(); 

     List<Test> testList = new List<Test>(); 
     testList.Add(new Test() { W = 0, X = "hello", Y = "one" }); 
     testList.Add(new Test() { W = 1, X = "hello", Y = "two" }); 
     testList.Add(new Test() { W = 2, X = "hello", Y = "three" }); 
     testList.Add(new Test() { W = 3, X = "hello", Y = "four" }); 

     var query = 
      from values in testList 
      select new { ID = values.W, Name = values.X, Text = values.Y }; 

     DataGrid6S.ItemsSource = query; 

    } 

    private void Button_Click(object sender, RoutedEventArgs e) { 
     var obj = ((FrameworkElement)sender).DataContext; 
     // Can't access values because it's of an anoymous type. 
     // What do I have to do to be able to access the values stored here? 

    } 
} 

当点击一个按钮,我想知道哪个该按钮是该行的ID点击,但我找不到,因为行是用匿名类型初始化的,我需要做些什么才能找到点击行的ID?

注意:这是一个简化版本假设查询由5个连接&一个where子句组成。

+0

一个不使用像这样的演员,我会建议。 'var button =(FrameworkElement)sender; var context =(Bla)button.DataContext;'只有在之后检查null时才使用as-casts。 – 2012-08-14 20:37:50

回答

0

只需创建一个指定类型并选择该类型的实例,匿名类型适用于仅在其创建范围内编辑的对象。另外为什么不直接使用Test类?唯一的区别是属性名称。另外,不要忘了将DataContext转换为您的指定类型,因为它是object

+0

如何?我还不知道完整的C#语法,并且我试图为这个问题寻找答案,只是没有人像我一样愚蠢; _; – ProgrammerAtWork 2012-08-14 20:29:38

+0

@ProgrammerAtWork:请参阅[此答案](http://stackoverflow.com/a/9164381/546730)。此外,如果您在投射时遇到问题:您已经对“FrameworkElement”进行了投射,对于其他任何课程都采用相同的方式。 – 2012-08-14 20:32:39

+0

明白了!我已经实现了它,现在编辑我的问题。 – ProgrammerAtWork 2012-08-14 20:33:16

0

为什么要在查询中使用匿名类型?您已经有一个很好的对象,可以保存您需要的所有数据,完全按照您使用的格式。通过将所有有用的信息转换为匿名查询,您可以显式删除所有有用的信息。只需将testList设置为数据源并访问按钮单击中的Test项目。