在 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}
的操作。
我正在使用 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}
的操作。