如何在ItemSource之外绑定DataGridComboBoxColumn

Joh*_*aft 2 c# data-binding wpf xaml datagrid

我正在开发我的第一个'生产'WPF应用程序,我遇到了一个问题.
我有一些类似于下面的例子的代码.我遇到的问题是我无法ComboBox填充.我猜想这是因为GridItemsSource是'堵’ ComboBox,从能够看到的视图模型的任务集合,但我只是猜测.其他一切都是正确的数据绑定.

我搜索了SO并找到了这个问题; 这听起来和我想做的完全一样,但它对我不起作用.

知道为什么我不能进入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; }
}
Run Code Online (Sandbox Code Playgroud)

视图模型:

public ApprovalViewModel{
  public ObservableCollection<Activity> Activities { /* ... property logic */ }
  public ObservableCollection<Task> Tasks { /* ... property logic */ }
}
Run Code Online (Sandbox Code Playgroud)

视图:

<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>
Run Code Online (Sandbox Code Playgroud)

编辑:正确的ComboBox代码在这里:

<ComboBox 
  ItemsSource="{Binding Path=DataContext.Tasks, 
                        RelativeSource={RelativeSource FindAncestor, 
                                        AncestorType={x:Type UserControl}}}"
  SelectedValue="{Binding Task.Title}"
  SelectedValuePath="Title"
  DisplayMemberPath="Title"/>
Run Code Online (Sandbox Code Playgroud)

Chr*_*nty 5

你在问题出在哪里是正确的,绑定是相对的Activity.所以它正在寻找Activity.Tasks.

您链接的帖子有正确的方法,您只需根据您的情况调整它.

ItemsSource="{Binding Path=DataContext.Tasks, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" 
Run Code Online (Sandbox Code Playgroud)

这将返回Visual树,查找具有DataContext.Tasks属性的Window .

你的代码示例是在窗口内吗?如果不是,您将需要更改{x:Type},其次是DataContext此对象上的设置?如果不是,则需要将其设置为ViewModel.