2011-02-23 11 views
2

첫 번째 '프로덕션'WPF 앱에서 작업 중이며 문제가 발생했습니다.
아래 예제와 비슷한 코드가 있습니다. 문제는 내가 ComboBox을 채울 수 없다는 것입니다. 나는 그것이 GridItemsSource이 이 ViewModel의 Tasks 컬렉션을 볼 수 없도록 차단하고 있기 때문에 가정하고 있지만 추측 만하고 있습니다. 다른 모든 것은 정확하게 데이터 바인딩입니다.ItemSource 외부에서 DataGridComboBoxColumn을 바인딩하는 방법

나는 SO를 닦아서 this 질문을 발견했다; 나는 정확하게하려고하는 것과 같게 들린다. 그러나 그것은 나를 위해 일하지 않았다.

ComboBox을 채울 수없는 이유는 무엇입니까?

모델 :

public class Activity{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public Task Task { get; set; } 
} 

public class Task{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
} 

뷰 모델 :

public ApprovalViewModel{ 
    public ObservableCollection<Activity> Activities { /* ... property logic */ } 
    public ObservableCollection<Task> Tasks { /* ... property logic */ } 
} 

보기 :

<DataGrid ItemsSource="{Binding Activities}" AutoGenerateColumns="False"> 
    <DataGrid.Resources> 
     <DataTemplate x:Key="displayTemplate"> 
      <TextBlock Text="{Binding Task.Title}"/> 
     </DataTemplate> 
     <DataTemplate x:Key="editTemplate"> 
      <ComboBox ItemsSource="{Binding Tasks}" <!--I think the problem is here--> 
       SelectedValue="{Binding Task}" 
       DisplayMemberPath="Title"/> 
     </DataTemplate> 
    </DataGrid.Resources> 
    <DataGrid.Columns> 
     <DataGridComboBoxColumn DisplayMemberPath="Title"/> 
     <DataGridTextColumn Binding="{Binding User}" Header="User"/> 
     <DataGridTextColumn Binding="{Binding Task.Project.Title}" Header="Project"/> 
     <DataGridTemplateColumn 
      Header="Task" 
      CellTemplate="{StaticResource displayTemplate}" 
      CellEditingTemplate="{StaticResource editTemplate}"/> 
     <DataGridTextColumn Binding="{Binding Description}" Header="Description"/> 
    </DataGrid.Columns> 
</DataGrid> 

편집 : 올바른 ComboBox 코드가 여기에 있습니다 :

<ComboBox 
    ItemsSource="{Binding Path=DataContext.Tasks, 
         RelativeSource={RelativeSource FindAncestor, 
             AncestorType={x:Type UserControl}}}" 
    SelectedValue="{Binding Task.Title}" 
    SelectedValuePath="Title" 
    DisplayMemberPath="Title"/> 

답변

5

문제가있는 곳에서 올바른지 확인하십시오. 바인딩은 Activity에 상대적입니다. 그래서 그것은 Activity.Tasks을 찾고 있습니다.

링크 된 게시물은 적절한 접근 방식을 가졌으므로 상황에 맞게 조정해야합니다.

ItemsSource="{Binding Path=DataContext.Tasks, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" 

그러면 시각적 트리를 다시 표시하여 DataContext.Tasks 속성이있는 창을 찾습니다.

코드 예제가 창 안에 있습니까? 그렇지 않으면 {x : Type}을 (를) 변경해야하며 두 번째로이 개체에 DataContext이 설정되어 있습니까? 그렇지 않으면 ViewModel로 설정해야합니다.

+0

감사합니다. 완벽하게 작동했습니다. x : Type을 UserControl로 설정해야했습니다. 또한 FindAncestor가 Intellisense에 나타나지 않기 때문에 혼란 스러웠습니다 (여전히 있습니다). 그래도 작동하는 것 같습니다. –

관련 문제