2009-03-30 2 views
2

У меня есть столбец шаблона DataGrid с ComboBox. Когда я выбираю значение и нажимаю Enter, связанные данные не обновляются (я вижу пустую ячейку).Проблемы с DataGridTemplateColumn с ComboBox

XAML:

<Window x:Class="WpfGrid2.Window2" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    xmlns:dg="clr-namespace:Microsoft.Windows.Controls;assembly=WpfToolkit" 
    > 

    <Window.Resources> 
     <x:Array x:Key="people" Type="sys:Object" /> 

     <x:Array x:Key="knownLastNames" Type="sys:String"> 
      <sys:String>Smith</sys:String> 
      <sys:String>Johnson</sys:String> 
      <sys:String>Williams</sys:String> 
     </x:Array> 
    </Window.Resources> 

    <StackPanel> 
     <dg:DataGrid x:Name="_grid" ItemsSource="{DynamicResource people}" CanUserAddRows="True" AutoGenerateColumns="False"> 
      <dg:DataGrid.Columns> 

       <dg:DataGridTemplateColumn Header="LastName" MinWidth="100"> 
        <dg:DataGridTemplateColumn.CellEditingTemplate> 
         <DataTemplate> 
          <ComboBox ItemsSource="{DynamicResource knownLastNames}" SelectedItem="{Binding LastName}"></ComboBox> 
         </DataTemplate> 
        </dg:DataGridTemplateColumn.CellEditingTemplate> 
        <dg:DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding LastName}" /> 
         </DataTemplate> 
        </dg:DataGridTemplateColumn.CellTemplate> 
       </dg:DataGridTemplateColumn> 

      </dg:DataGrid.Columns> 
     </dg:DataGrid> 

     <Button>test</Button> 
    </StackPanel> 
</Window> 

Code-Behind:

namespace WpfGrid2 
{ 
    public partial class Window2 : Window 
    { 
     public Window2() 
     { 
      InitializeComponent(); 

      List<Person> people = new List<Person>(); 
      this.Resources["people"] = people; 
     } 
    } 
} 

Если изменить ComboBox в TextBox, он отлично работает

<TextBox Text="{Binding LastName}" /> 

Что не так?

ответ

1

Я не знаю, является ли это приемлемым решением вашей проблемы, но если вы измените привязку ItemsSource Combo-Box к StaticResource, работа с привязкой будет работать.

... 

<ComboBox ItemsSource="{StaticResource knownLastNames}" ... /> 

... 

Я уверен, что то, что происходит в том, что, когда ComboBox выгружается (когда EditTemplate выгружается из-за подачи новой записи), то DynamicResource пытается найти ресурс снова, и терпит неудачу (потому что ComboBox больше не находится в визуальном дереве, он не найдет ресурс, определенный выше в визуальном дереве). Это установит значение ItemsSource равным null, а также установите для SelectedItem значение null, таким образом, значение LastName будет равно null.

С помощью StaticResource коллекция выполняется только один раз, прежде чем ComboBox будет показан, поэтому он не будет сброшен до нуля.

+0

Ваше решение работает и объясняет причины. Кажется, мне нужен другой способ сделать ItemSource обновляемым ... – alex2k8

0

Другая альтернатива (согласно логике ответа Abe Heidebrecht) заключается в перемещении «knownLastNames» в Application.Resources. См. Пункт № 3.

Dynamic resource lookup behavior

  1. процесс поиска проверяет запрашиваемого ключа в словаре ресурсов , определяемого элемента , который устанавливает свойство.

  2. Процесс поиска затем пересекает логическое дерево вверх, к родительского элемента и его словаря ресурсов . Это продолжается до тех пор, пока не будет достигнут корневой элемент .

  3. Затем прикладные ресурсы проверено. Прикладными ресурсами являются эти ресурсы в ресурсе словарь, который определяется объектом приложения для вашего приложения WPF .

  4. Тема ресурса словарь проверено, для активных в настоящее время темы. Если тема изменяется на времени выполнения, значение переоценивается.

  5. Проверяется системные ресурсы.

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