Datagrid WPF中的SelectedItem绑定

Posted

技术标签:

【中文标题】Datagrid WPF中的SelectedItem绑定【英文标题】:SelectedItem Binding in Datagrid WPF 【发布时间】:2012-06-12 18:31:00 【问题描述】:

我有一个显示列的数据网格,通过代码设置 ItemsSource-Property 添加。我还有两列,它们是由 XAML 添加的(一个按钮以及网格中图像和按钮的组合)。 现在我正在编辑一些单元格并想阅读它们。 在 Windows 窗体中,可以读取特定的单元格,但在 WPF 中这是不可能或不推荐的,我读过。所以我想使用 SelectedItem-Binding。我的问题是, SelectedItem 始终为空。可能是因为“混合添加”列而导致 Datagrid 出现问题,或者我做错了什么。

这是我的代码的一部分:

XAML:

 <DataGrid AutoGenerateColumns="True" Margin="12,162,12,12" Name="dgExisting" CanUserAddRows="False" RowHeight="24" VerticalGridLinesBrush="#50000000" HorizontalGridLinesBrush="#50000000" SelectionMode="Single" CellStyle="StaticResource DataGridCell_Centering" CellEditEnding="dgExisting_CellEditEnding" SelectedItem="Binding SelectedItem, Mode=TwoWay">            
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Password" Width="60" IsReadOnly="True">
                <DataGridTemplateColumn.CellTemplate>                        
                    <DataTemplate>
                        <Button Style="StaticResource Flat" Click="btnDgChangePassword_Click">
                            <Grid>
                                <Image Source="Binding imgStatus" Margin="0,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
                                <Label Content="Binding PasswordState" Margin="16,-5,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Height="25" />
                            </Grid>
                        </Button>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Delete" Width="50" IsReadOnly="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Click="btnDgRemove_Click" Style="StaticResource Flat">
                            <Image Source="Images/redcross16.png" />
                        </Button>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

以及我如何通过代码添加列的代码:

//Create Table for Gridview
DataTable dtList = new DataTable();
dtList.Columns.Add(new DataColumn("Username"));
dtList.Columns.Add(new DataColumn("PasswordState"));
dtList.Columns.Add(new DataColumn("Domain"));
dtList.Columns.Add(new DataColumn("Description"));
dtList.Columns.Add(new DataColumn("id"));

foreach (UserCredential uc in credentialList)

    DataRow dR = dtList.NewRow();                
    dR["Username"] = uc.getUsername();
    dR["PasswordState"] = (uc.getPassword().Length > 0 ? "yes":"no");
    dR["Domain"] = uc.getDomain();
    dR["Description"] = uc.getDescription();
    dR["id"] = uc.getId();

    dtList.Rows.Add(dR);


dtList.Columns.Add("imgStatus");

for (int i = 0; i < dtList.Rows.Count; i++)

    dtList.Rows[i]["imgStatus"] = (dtList.Rows[i]["PasswordState"].ToString() == "yes" ? "Images/key16.png" : "");


dgExisting.ItemsSource = dtList.DefaultView;
dgExisting.Columns[getColumnId("Password")].DisplayIndex = 2; //reorder Key-Image
dgExisting.Columns[getColumnId("PasswordState")].Visibility = System.Windows.Visibility.Hidden; 
dgExisting.Columns[getColumnId("imgStatus")].Visibility = System.Windows.Visibility.Hidden; 
dgExisting.Columns[getColumnId("id")].Visibility = System.Windows.Visibility.Hidden; 

【问题讨论】:

SelectedItem 属性在哪里?它的数据类型是什么?网格的DataContext是否设置在任何地方? 您是否尝试在代码隐藏中添加SelectionChanged 事件处理程序,以查看问题是DataGrid 中的选择没有改变还是绑定有问题? @KDiTraglia SelectedItem 位于 XAML 第一行的末尾,您必须滚动很多,但它就在那里。如果他可以看到他的行(并因此做出选择),则可以合理地假设 DataContext 已正确设置。 @CodingGorilla 我在 xaml 中看到它,我在询问它绑定到的支持属性。并且行显示是因为他在代码中明确设置了网格的ItemsSource,所以可能没有设置DataContext。 @KDiTraglia 是的,很好,我正在滚动查看SelectedItem 上的竞标,甚至没有看到。接得好! =) 【参考方案1】:

在您的 C# 代码中,您没有创建到 DataGrid 的项目源的绑定。

dgExisting.ItemsSource = dtList.DefaultView;

不是绑定。这就是您的 SelectedItem 在 XAML 绑定中始终为空的原因。要在代码中创建绑定,您需要执行以下操作:

var binding = new Binding("ItemsSource");
binding.Source = dtList.DefaultView;
dgExisting.SetBinding(DataGrid.ItemsSourceProperty, binding);

在 C# 中设置绑定 WPF 有点异味。您必须这样做可能是有原因的。但是,我建议重新设计您的应用程序以更好地遵循 MVVM 模式,这样您就可以在 XAML 中设置您的绑定。

【讨论】:

以上是关于Datagrid WPF中的SelectedItem绑定的主要内容,如果未能解决你的问题,请参考以下文章

WPF DataGrid MultiBinding到DataGrid ItemSsource中的类

WPF 中DataGrid的应用

如何隐藏 WPF DataGrid 中的列标题?

DataGrid中的WPF绑定到DataContext

如何使用 MVVM 自动隐藏 WPF 中的 DataGrid 列? [复制]

删除 WPF DataGrid 中的空白列