2013-08-05 104 views
0

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

这是怎么了填充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"/> 
+0

你有什么设置你的datacontext? – Shoe

+0

我没有设定在这种情况下,电网的任何的datacontext –

+0

看看http://stackoverflow.com/questions/3743269/editable-combobox-with-binding-to-value-not-in-list和尝试那些解决方案 – Shoe

回答

4

的数据丢失的原因是因为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> 
+0

这是一个很好的答案。谢谢。但是,虽然这对于组合列表中的现有项目完美适用,但我无法通过它添加新项目。有任何想法吗 ? –

+0

只需将'SelectedValue'改为'Text'。这将导致Combobox的文本框控件取不包含在列表中的值。但请注意,添加自己的值不会导致它们进入列表。为了实现这个功能,你必须在诸如'LostFocus'之类的东西上为组合框编写事件处理程序。 – Shoe

+0

当我将其更改为SelectedValue时,它会再次丢失数据。但是我离开这个作为答案,因为我无法在这一点上添加新记录。感谢您的帮助 –