Я работаю над своим первым «производственным» WPF-приложением, и у меня возникла проблема.
У меня есть код, который похож на пример ниже. У меня проблема в том, что я не могу заставить ComboBox
заполниться. Я предполагаю, что это потому, что Grid
s ItemsSource
"блокирует" ComboBox
от возможности видеть коллекцию Tasks на ViewModel, но я только догадываюсь. Все остальное правильно привязано к данным.
Я отыскивал ТАК и нашел этот вопрос; это звучит так же, как то, что я пытаюсь сделать, но у меня это не сработало.
Есть идеи, почему я не могу заставить 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; }
}
ViewModel:
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"/>