【问题标题】:avoid anonymous types in datacontext?避免数据上下文中的匿名类型?
【发布时间】:2012-08-14 20:17:23
【问题描述】:

我有这个数据网格

<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 子句组成。

【问题讨论】:

  • 我建议不要使用这样的演员表。 var button = (FrameworkElement)sender; var context = (Bla)button.DataContext; 只有在之后检查 null 时才使用 as-casts。

标签: c# wpf linq xaml datagrid


【解决方案1】:

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

【讨论】:

  • 怎么样?我还不知道完整的 C# 语法,我试图寻找这个问题的答案,只是没有人像我一样愚蠢;_;
  • @ProgrammerAtWork:见this answer。此外,如果您在投射时遇到问题:您已经对 FrameworkElement 进行了投射,对任何其他课程的工作方式都相同。
  • @ProgrammerAtWork:不要编辑你的问题,答案属于那里。如果有什么发布答案。 (我也不认为实现细节是必要的)
  • 不能这样做,显然我还没有足够的声誉。我们。明天我会发布它。谢谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2011-07-29
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多