2013-08-05 3 views
0

У меня проблема с сохранением выбранного элемента в столбце DataGridTemplate ComboBox. У меня есть DataTemplate редактируемый столбец combobox как первый столбец в datagrid и рядом с ним, у меня есть текстовый столбец. DataGrid заполняется данными, считываемыми из хранимой процедуры SQL. Все работает отлично, за исключением случаев, когда я выбираю элемент в поле со списком и перемещаюсь в текстовое поле и начинаю вводить его, комбо-выбор заканчивается. Он очищает как новый элемент, так и существующий элемент. Как это ни странно, это происходит только в первый раз. Когда я повторно выбираю значение ComboBox или добавляю новый элемент снова и возвращаюсь в текстовое поле, он не затухает. У меня заканчиваются идеи и пробовал много комбинаций, но пока не повезло. Вот мой код:Ошибка привязки DataGrid 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"/> 
+0

Для чего вы установили свой datacontext? – Shoe

+0

Я не задал какой-либо datacontext для Grid в этом случае –

+0

Взгляните на http://stackoverflow.com/questions/3743269/editable-combobox-with-binding-to-value-not-in-list и попробуйте эти решения – Shoe

ответ

4

причина, по которой данные теряются, заключается в том, что CellTemplate предоставляет только не- редактируя функции, поэтому всякий раз, когда вы изменяли значение в поле со списком при редактировании новой строки, данные не устанавливались, потому что не было реализаций в режиме редактирования, поэтому никакой объект не создавался за кулисами. В DatagridTextColumn автоматически создается редактирование, поэтому combobox будет работать после редактирования этого типа ячейки.

<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 примет значения, не включенные в список. Обратите внимание, однако, что добавление собственных значений не приведет к их входу в список. Чтобы достичь этой функциональности, вы должны написать обработчик событий для combobox на что-то вроде «LostFocus». – Shoe

+0

Он теряет данные снова, когда я меняю его на SelectedValue. Но я оставляю это как ответ, так как могу обойтись без возможности добавления новых записей. Спасибо за вашу помощь –

Смежные вопросы