2

我在 DataGridTemplate 列 ComboBox 中保留所选项目时遇到问题。我将 DataTemplate 可编辑组合框列作为数据网格中的第一列,在它旁边,我有一个文本列。DataGrid 填充了从 SQL 存储过程中读取的数据。一切正常,除了当我在组合框中选择一个项目并移动到文本字段并开始输入时,组合选择空白。它为新项目或现有项目都清空。奇怪的是,这只是第一次发生。当我重新选择 ComboBox 值或再次添加新项目并返回到文本字段时,它不会空白。我的想法不多了,尝试了很多组合,但到目前为止还没有运气。这是我的代码:

这就是我填充 DataGrid 的方式:

using (SqlCommand cmd = new SqlCommand())
{
    cmd.CommandText = "GetProducts";
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Connection = sqlConn;

    var reader = cmd.ExecuteReader();
    var dt = new DataTable();
    dt.Load(reader);
    dt.Columns["ProductName"].AllowDBNull = true;
    dtProductCfgTable = dt;
    ProductCfgGrid.ItemsSource = dtProductCfgTable.DefaultView;
}

这是 ProductNamesList 的声明:

public List<string> ProductNamesList { get; set; }

XAML:

<DataGridTemplateColumn Header="ProductName">
   <DataGridTemplateColumn.CellTemplate>
      <DataTemplate>
        <ComboBox ItemsSource="{Binding ProductNamesList, 
                                RelativeSource={RelativeSource AncestorType=Window}}"  
                                SelectedItem="{Binding ProductName 
                                IsSynchronizedWithCurrentItem="False"  
                                BorderThickness="1.2 1.2 0 0" BorderBrush="Black" 
                                Background="LightCyan" IsEditable="True" />
      </DataTemplate>
   </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>  
<DataGridTextColumn Binding="{Binding ShippingAddress}" 
                    Width="100" 
                    Header="ShippingAddress" 
                    Visibility="Visible"/>
4

1 回答 1

7

数据丢失的原因是因为CellTemplate唯一提供了非编辑功能,所以每当你在编辑新行时更改组合框中的值时,数据没有被设置,因为没有编辑模式实现,所以没有对象是在幕后创建的。DatagridTextColumn 自动内置了编辑功能,这就是组合框在编辑此类单元格后可以工作的原因。

<DataGridTemplateColumn Header="ProductName" >
     <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
                 <ComboBox ItemsSource="{Binding ProductNamesList, 
                 RelativeSource={RelativeSource AncestorType=Window}}" 
                 SelectedValue="{Binding ProductName, Mode=TwoWay}"
                 IsSynchronizedWithCurrentItem="False"
                 IsEditable="False"
                 IsHitTestVisible="False" />
         </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
     <DataGridTemplateColumn.CellEditingTemplate>
         <DataTemplate>
             <ComboBox ItemsSource="{Binding ProductNamesList, 
                 RelativeSource={RelativeSource AncestorType=Window}}" 
                 Text="{Binding ProductName, Mode=TwoWay}"
                 IsSynchronizedWithCurrentItem="False"
                 IsEditable="True" />
         </DataTemplate>
     </DataGridTemplateColumn.CellEditingTemplate>
 </DataGridTemplateColumn>

仅当您希望用户在非编辑模式下看到组合框时,才需要组合框中的冗余。如果你不关心,你可以简单地写:

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding ProductName}" />
    </DataTemplate>
 </DataGridTemplateColumn.CellTemplate>
于 2013-08-05T17:08:08.403 回答