在 AvaloniaUI/ReactiveUI 应用中的 DataGrid 中绑定 ComboBox DataTempl



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

例如,假设有两个表,即"类">

和"教师",其中"类"保存"教师"表的外键。

课程和教师具有以下模型:

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; }

我希望类显示在数据网格中。为此,我使用了 编程(类型安全(反应式 UI 绑定,如下所示

<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);
...

到目前为止,这运行良好,讲师列甚至显示名称 的教师,尽管"类"表仅包含外键 到教师表中(这通过导航属性工作 在类中(。

要编辑课程的讲师,该列应使用 ComboBox 作为编辑器,所以我可以从所有现有的讲师中进行选择。我从

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

但这就是我卡住的地方。直接绑定表达式不起作用 因为教师集合不是类的子属性,并且 我知道没有办法以编程方式绑定 Items 属性(项目源 在 WPF 中(在数据网格列的数据模板中。由于我使用程序化 与所有(顶级(元素的响应式UI绑定,我也没有设置。 包含数据网格的窗口的 DataContext 属性。

知道如何做到这一点吗?

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

最新更新