我正在制作我的第一个“制作”WPF应用,我遇到了一个问题
我有一些类似于下面的例子的代码。我遇到的问题是我无法填充ComboBox
。我假设这是因为Grid
的{{1}}'阻止'ItemsSource
能够在ViewModel上看到Tasks集合,但我只是在猜测。其他一切都是正确的数据绑定。
我搜索了SO并找到了this个问题;这听起来和我想做的完全一样,但它对我没用。
知道为什么我不能让ComboBox
填充?
型号:
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
答案 0 :(得分:5)
问题出在哪里是正确的,绑定是相对于Activity
的。所以它正在寻找Activity.Tasks
。
您链接的帖子有正确的方法,您只需根据您的情况进行调整。
ItemsSource="{Binding Path=DataContext.Tasks, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
这将返回Visual树,查找一个具有DataContext.Tasks
属性的Window。
您的代码示例是否在窗口内?如果不是,您将需要更改{x:Type},其次是此对象上设置的DataContext
?如果不是,则需要将其设置为ViewModel。