[英]SelectedItem Binding in Datagrid WPF
我有一個Datagrid,它顯示列,這些列是通過通過代碼設置ItemsSource-Property添加的。 我還具有XAML添加的兩列(一個按鈕以及網格中圖像和按鈕的組合)。 現在,我正在編輯一些單元格,並希望閱讀它們。 在Windows窗體中,可以讀取特定的單元格,但是在WPF中這是不可能的或不建議這樣做。 所以我想使用SelectedItem-Binding。 我的問題是,SelectedItem始終為null。 也許由於列的“混合添加”而導致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;
在您的C#代碼中,您沒有創建到DataGrid的項目源的綁定。
dgExisting.ItemsSource = dtList.DefaultView;
不具有約束力。 這就是為什么您的SelectedItem在XAML綁定中始終為null的原因。 要在代碼中創建綁定,您需要執行以下操作:
var binding = new Binding("ItemsSource");
binding.Source = dtList.DefaultView;
dgExisting.SetBinding(DataGrid.ItemsSourceProperty, binding);
在C#中設置綁定WPF有點氣味。 您可能有理由這樣做。 但是,我建議您重新設計應用程序以更好地遵循MVVM模式,以便您可以僅在XAML中設置綁定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.