2009-03-30 3 views
2

ComboBox가있는 DataGrid 템플릿 열이 있습니다. 값을 선택하고 Enter 키를 누르면 바인딩 된 데이터가 업데이트되지 않습니다 (빈 셀이 표시됨).ComboBox가있는 DataGridTemplateColumn의 문제점

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> 

코드 숨김 :

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

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

내가 텍스트 상자에 콤보 상자를 변경하는 경우, 그것은 잘 작동

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

에 어떤 문제가 있습니까?

답변

1

나는이 문제에 대한 가능한 솔루션입니다 알고 있지만하지 않는 당신은 ItemsSource가 정적 리소스, 바인딩 작품에 콤보 상자의 바인딩을 변경하는 경우.

... 

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

... 

나는 (어떤 일이 일어나고 것은합니다 (EditTemplate 인해 새로운 기록을 제출하기 언로드 될 때) 콤보 상자가 언로드 될 때 DynamicResource 다시 리소스를 조회하려고 시도하고, 실패 할 것을 확신 오전 때문에 ComboBox는 더 이상 시각적 트리에 없으며 시각적 트리에서 위에 정의 된 리소스를 찾지 않습니다. ItemsSource를 null로 설정하고 SelectedItem을 null로 설정하여 LastName을 null로 설정합니다. 콤보가 표시되기 전에 정적 리소스와

는 수집 한 번만 검색이므로 NULL로 초기화되지 않는다. 합니다 ('아베 Heidebrecht'대답의 논리 다음)

+0

귀하의 솔루션이 작동하고 설명이 sence을합니다. ItemsSource를 업데이트 할 수있는 다른 방법이 필요합니다 ... – alex2k8

0

또 다른 대안에 Application.Resources으로 'knownLastNames'을 이동하는 것입니다. 포인트 # 3 참조.

Dynamic resource lookup behavior

  1. 속성을 설정 요소 의해 한정된 자원 사전 내의 요청 키 룩업 프로세스 검사한다.

  2. 룩업 프로세스는 다음 부모 요소 및 자원 사전에, 논리 트리 상방을 통과. 이는 루트 요소에 도달 할 때까지 계속됩니다.

  3. 다음, 응용 프로그램 자원이 을 검사합니다. 응용 프로그램 리소스는 WPF 응용 프로그램에 대한 응용 프로그램 객체에 의해 정의 된 자원 사전에서 그 자원입니다.

  4. 테마 자원 사전은 현재 활성화 된 주제에 대해 입니다. 테마가 런타임에서 변경되면 값이 다시 평가됩니다.

  5. 시스템 리소스가 확인되었습니다.