2013-03-20 2 views
1

WPF 데이터 격자 (ControlBase라는 기본 클래스에서 파생 된 사용자 정의 컨트롤에서 호스팅 됨)에 드롭 다운 열을 가져와서 올바르게 바인딩하려고합니다. 처음에는 개체에서 벌금을 채우고 셀을 편집 할 때 채워진 드롭 다운이 나타납니다. 그러나 포커스를 유지하면 선택한 값이 다시 셀로 들어 가지 않습니다.WPF DataGrid 드롭 다운 양방향 바인딩

은 여기 내 모델과 도메인 객체이다 :

public UserControlModel _model; 
public UserControlModel Model 
{ 
    set 
    { 
    _model = value; 
    DataContext = null; 
    DataContext = _model; 
    } 
} 

여기 XAML에서 내 데이터 그리드의 열 정의입니다 :

public class ModelBase : INotifyPropertyChanged 
{ 
    public IList<Person> Persons { get; set; } 
} 

public class UserControlModel : ModelBase 
{ 
    public ObservableCollection<DatagridRecord> SourceData { get; set; } 
} 

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class DatagridRecord 
{ 
    public string Name { get; set; } 
    public Person ContactPerson { get; set; } 
} 

그리고 내 xaml.cs에서

, 나는이 모델의 속성을 통해 DataContext를 설정

<DataGridTemplateColumn Header="Person" > 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
     <TextBlock Text="{Binding Path=ContactPerson.Name}"/></DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
     <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <ComboBox ItemsSource="{Binding Path=DataContext.Persons, 
         RelativeSource={RelativeSource AncestorType={x:Type uch:ControlBase}}}" 
         DisplayMemberPath="Name" 
         SelectedValuePath="Id" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
</DataGridTemplateColumn> 

그리드 행에 선택한 콤보 박스 값을 연결하는 데 문제가있는 것으로 생각됩니다. 그러나 나는 그것을 끌어들이려고 서클 주위에 갔다. 어떤 조언을 주시면 감사하겠습니다.

코리.

답변

1

당신은 SelectedItem 또는 SelectedValue 바인딩이 누락 :

<ComboBox ItemsSource="{Binding Path=DataContext.Persons, 
         RelativeSource={RelativeSource AncestorType={x:Type uch:ControlBase}}}" 
         DisplayMemberPath="Name" 
        --> SelectedItem="{Binding ContactPerson}" <-- 
         SelectedValuePath="Id" /> 
+0

작품! 감사. 셀을 클릭했을 때 드롭 다운에서 셀 내용을 이미 선택 했습니까? 그렇지 않으면 셀을 클릭 할 때 펼칠 때까지 드롭 다운에 빈 선택이 표시됩니다. – cardinalPilot

+1

'SelectedItem' 대신'SelectedValue'를 사용할 수 있습니다. 그런 식으로 작동하지만, ViewModel에'public int PersonId' 속성이 있어야합니다. –

+0

도메인 클래스는 EF Code First의 POCO입니다. EF는 PersonId 속성과 Person 속성을 클래스에 포함 할 수있을만큼 스마트하고 데이터베이스 스키마를 망가 뜨리지는 않습니다. – cardinalPilot