如何在ItemSsource之外绑定DataGridComboBoxColumn

时间:2011-02-23 00:04:54

标签: c# wpf xaml data-binding datagrid

我正在制作我的第一个“制作”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

1 个答案:

答案 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。

相关问题