数据绑定导致页面上的其他功能在填充数据网格时不起作用

Databinding causing other functions on page not to work when filling datagrid

我的视图中有一个数据网格。数据网格的项目源 属性 是这样绑定的

ItemsSource="{Binding}"

此外,在代码隐藏中,我通过执行以下操作设置了数据上下文:

DataContext = ProcedureDatabaseViewModel.Procedures();

viewmodel 中的 Procedures 函数成功输出了 DataGrid 成功显示的列表。

现在的问题是整个页面的datacontext现在设置为上面的。这样做的结果是与 VM 交互的其他元素不再起作用。 IE。具有在 VM 中找到的命令的按钮。我曾尝试在后面的代码中删除数据上下文的设置,但无法弄清楚如何以其他方式填充数据网格。请注意,当 DataContext 未在代码中设置时,我相信上下文将更改为 VM,因此其他元素将再次开始工作。我尝试更改 Itemssource 属性 以定位我希望用来填充数据网格的对象列表,但它没有用。

名单是

List<procedure> Procedures

它在 ProdureDatabaseViewModel 中。我试图将其定位为

ItemsSource="{Binding ProdureDatabaseViewModel.Procedures}"

但这也没有用。

有人可以告诉我正确的方法吗?

我更喜欢将视图构造函数中的 DataContext 设置为完整的 ViewModel(我为此特殊视图创建的)。

所以我在视图的构造函数中做了这样的事情:

public View(ProcedureDatabaseViewModel viewModel)
{
    this.DataContext = viewModel;
}

这样一来,其他一切都应该仍然有效,而且您可以使用的不仅仅是程序。

接下来将过程绑定到数据网格:

ItemsSource="{Binding ProcedureList}"

请注意,"Procedures" 必须是 属性 才能正常工作。在你的问题中不清楚它是一个函数,一个 属性 还是一个简单的 class 成员。如果它是一个函数,你可以在你的视图模型中这样做:

public List<procedure> ProcedureList
{
    get { return this.Procedures(); }
}

最简洁的方法是使用 ItemsSource 将 Procedures 集合绑定到 DataGrid。为此,程序必须是 属性。为避免进一步的问题,请使用 ObservableCollection。它应该是这样的:

ObservableCollection<procedure> Procedures { get; set; }

那么你应该可以简单地通过

ItemsSource="{Binding Procedures}"

I have tried removing the setting of the datacontext in the code behind but cannot figure out how to populate the datagrid otherwise.

您可以像这样单独设置 DataGrid 的 DataContext,MyDataGrid.DataContext = ProcedureDatabaseViewModel.Procedures();

并为您的Page申请单独的DataContext