첫 번째 '프로덕션'WPF 앱에서 작업 중이며 문제가 발생했습니다.
아래 예제와 비슷한 코드가 있습니다. 문제는 내가 ComboBox
을 채울 수 없다는 것입니다. 나는 그것이 Grid
의 ItemsSource
이 이 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"/>
감사합니다. 완벽하게 작동했습니다. x : Type을 UserControl로 설정해야했습니다. 또한 FindAncestor가 Intellisense에 나타나지 않기 때문에 혼란 스러웠습니다 (여전히 있습니다). 그래도 작동하는 것 같습니다. –