2013-08-05 70 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時,它會再次丟失數據。但是我離開這個作爲答案,因爲我無法在這一點上添加新記錄。感謝您的幫助 –