为什么我的DataGrid在绑定数据源中有项目时不显示行?

时间:2017-10-27 09:44:35

标签: c# wpf data-binding wpfdatagrid

当主窗口 - 仅显示我的DataGrid时,DataGrid显示零行。

这就是我的网格状态:

<DataGrid                 
        AutoGenerateColumns="True"
        CanUserAddRows="False"
        CanUserReorderColumns="True"
        CanUserResizeColumns="True"
        DataContext="ClientListViewModel"
        ItemsSource="{Binding Source=RowItems}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Given Name" Binding="{Binding GivenName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
        <DataGridTextColumn Header="Family Name" Binding="{Binding FamilyName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
        <DataGridTextColumn Header="Gender" Binding="{Binding Gender, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
        <DataGridTextColumn Header="Date of Birth" Binding="{Binding DateOfBirth, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

Source={Binding Source=RowItems}来源是我的主视图模型RowItems上的属性ClientListViewModel

viewmodel在我的主视图Read的ctor中调用了ClientListView方法。当我调试此问题时,我可以看到RowItems项源已正确填充。

我对主视图的初始化,UserControl包含有问题的DataGrid,如下所示:

public MainWindow()
{
    InitializeComponent();
    InitializeListView();
}

private void InitializeListView()
{
    var model = new ClientListViewModel();
    model.Read();
    var view = new ClientListView();
    view.DataContext = model;
    Content = view;
}

当我在model.Read();之后直接放置断点时,其model.RowItems属性显示12个项目,但DataGrid显示没有行。

为什么我的DataGrid呈现零行?

4 个答案:

答案 0 :(得分:3)

{Binding Source=RowItems} 

不会绑定到属性RowItems

您需要使用

 {Binding RowItems} 

还要确保ViewModel中的属性RowItems的类型为ObservableCollection,因为它会通知用户界面收集中有更改,而正常List则没有。 (如果在绑定后修改列表中的数据,则需要这样做)

答案 1 :(得分:0)

您需要确保绑定源(类)的访问修饰符设置为public。

答案 2 :(得分:0)

Source中的ItemsSource绑定中移除DataGrid,然后从"ClientListViewModel"移除DataContext

<DataGrid                 
        AutoGenerateColumns="True"
        CanUserAddRows="False"
        CanUserReorderColumns="True"
        CanUserResizeColumns="True"
        ItemsSource="{Binding RowItems}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Given Name" Binding="{Binding GivenName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
        <DataGridTextColumn Header="Family Name" Binding="{Binding FamilyName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
        <DataGridTextColumn Header="Gender" Binding="{Binding Gender, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
        <DataGridTextColumn Header="Date of Birth" Binding="{Binding DateOfBirth, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

默认情况下,绑定会继承DataContext属性指定的数据上下文(如果已设置)。但是,Source属性是您可以显式设置Binding的源并覆盖继承的数据上下文的方法之一。 如果你设置

ItemsSource="{Binding Source=RowItems}"

然后RowItems被翻译成字符串(长度为8),因此你会看到八行。

答案 3 :(得分:0)

所有部分都在那里,但它们没有正确安排。要利用DataBinding,您需要遵循特定的模式。在这种情况下,您应该按照以下步骤操作。

public MainWindow() {
    InitializeComponent();
    this.Clients = InitializeListView();
    this.DataContext = this;        
}

public ClientListViewModel Clients { get; set; }

private ClientListViewModel InitializeListView() {
    var model = new ClientListViewModel();
    model.Read();    
    return model;
}

您指出的MainWindow只包含DataGrid,应将其ItemSource相应地绑定到视图DataContext的属性,在本例中为MainWindow本身DataGrid将继承为DataContext

<DataGrid                 
        AutoGenerateColumns="False"
        CanUserAddRows="False"
        CanUserReorderColumns="True"
        CanUserResizeColumns="True"
        ItemsSource="{Binding Clients.RowItems}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Given Name" Binding="{Binding GivenName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
        <DataGridTextColumn Header="Family Name" Binding="{Binding FamilyName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
        <DataGridTextColumn Header="Gender" Binding="{Binding Gender, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
        <DataGridTextColumn Header="Date of Birth" Binding="{Binding DateOfBirth, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>