在 AvaloniaUI/ReactiveUI 应用程序的 DataGrid 中绑定 ComboBox DataTemplate

Binding a ComboBox DataTemplate inside a DataGrid in an AvaloniaUI/ReactiveUI app

我正在使用 AvaloniaUI/ReactiveUI 和 EF Core 构建一个 MVVM 应用程序,以便能够使用数据编辑一些 tables。 我想我使用 AvaloniaUI 的事实并没有起到太大的作用。 如果我使用 WPF,问题可能会是相同的(似乎更像是一个 ReactiveUI 问题)。

举个例子,假设有两个 tables,Classes 和 Instructors,其中 Classes 持有 Instructors table.[=15= 的外键]

Classes and Instructors 有以下型号:

class Class
{
    //Primary key
    public int ID { get; set; }
    public string Name { get; set; }
    //Foreign key to Instructors table
    public int InstructorID { get; set; }
    //Navigation property
    public Instructor Instructor { get; set; }
}

class Instructor
{
    //Primary key
    public int ID { get; set; }
    public string Name { get; set; }
}

主视图模型包含这两个集合

public List<Class> Classes { get; set; }
public List<Instructor> Instructors { get; set; }

我希望 classes 显示在 DataGrid 中。为此我用 像这样的编程(类型安全)ReactiveUI 绑定

<DataGrid Name="DGClasses">
  <DataGrid.Columns>
    <DataGridTextColumn Header="Name"
                        Binding="{Binding Name}" />
    <DataGridTextColumn Header="Instructor"
                        Binding="{Binding Instructor.Name}"/>
  </DataGrid.Columns>
</DataGrid>


...
this.OneWayBind(ViewModel, x => x.Classes, x => x.DGClasses.Items); 
this.Bind(ViewModel, x => x.SelectedClass, x => x.DGClasses.SelectedItem);
...

到目前为止效果很好,Instructor 列甚至显示姓名 尽管 Classes table 只包含外键 进入 Instructors table(这是通过导航 属性 在 Class class).

要编辑 class 的讲师,该列应使用 ComboBox 作为编辑,我可以 select 来自所有现有的讲师。我从

开始
<DataGridTemplateColumn Header="Instructor">
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <ComboBox Items="{Binding ??? }">
      </ComboBox>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

但这就是我被困的地方。直接绑定表达式不起作用 因为 Instructors 集合不是 Class 的子 属性 并且 我知道没有办法以编程方式绑定项目 属性 (ItemsSource 在 WPF 中)在 DataGrid 列的 DataTemplate 中。因为我使用程序化 ReactiveUI 与所有(顶级)元素的绑定我也没有设置 包含 DataGrid 的 Window 的 DataContext 属性。

知道如何完成这个吗?

您可以将您的组合框项目集合绑定到 DataGrid 上的一些特殊附加 属性(或者只使用 Tag)并执行类似 {Binding $parent[DataGrid].Tag} 的操作。