填充datagrid时,数据绑定导致页面上的其他功能无效

时间:2016-01-12 13:56:41

标签: wpf mvvm data-binding datagrid itemssource

我的视图中有一个数据网格。 datagrid的itemssource属性被绑定为

ItemsSource="{Binding}"

在代码隐藏中,我通过执行以下操作设置了datacontext:

DataContext = ProcedureDatabaseViewModel.Procedures();

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

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

列表是

List<procedure> Procedures

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

ItemsSource="{Binding ProdureDatabaseViewModel.Procedures}"

但这也没有用。

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

3 个答案:

答案 0 :(得分:1)

最干净的方法是使用ItemsSource将Procedures集合绑定到DataGrid。为此,程序必须是财产。要避免进一步的问题,请使用ObservableCollection。它应该如下所示:

ObservableCollection<procedure> Procedures { get; set; }

然后你应该能够简单地绑定它

ItemsSource="{Binding Procedures}"

答案 1 :(得分:0)

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

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

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

这样一切都应该仍然有效,你可以使用的不仅仅是程序。

接下来,将过程绑定到datagrid:

ItemsSource="{Binding ProcedureList}"

请注意,为此,“程序”必须是属性。在你的问题中不清楚它是一个函数,一个属性还是一个简单的类成员。如果它是一个函数,你可以在视图模型中这样做:

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

答案 2 :(得分:0)

  

我尝试删除代码中的datacontext设置   但是后面却无法弄清楚如何填充数据网格。

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

并为DataContext单独应用Page