2012-06-08 108 views
0

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

这里是我的代码的一部分:

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; 
+0

SelectedItem属性在哪里?它是什么数据类型?网格的DataContext是否设置在任何位置? –

+0

您是否尝试在代码隐藏中添加'SelectionChanged'事件处理程序以查看问题是否在DataGrid中选择未更改,或者问题是否与绑定有关? – CodingGorilla

+0

@KDiTraglia'SelectedItem'在XAML的第一行的末尾,你必须滚动很长一段时间,但它在那里。如果他可以看到他的行(从而做出选择),那么假设'DataContext'设置正确是合理的。 – CodingGorilla

回答

1

在你的C#代码你是不是创建一个绑定到DataGrid的项目源。

dgExisting.ItemsSource = dtList.DefaultView; 

不是具有约束力。这就是为什么您的SelectedItem在您的XAML绑定中始终为空。要在代码中创建一个绑定,您需要做的是这样的:

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

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