当主窗口 - 仅显示我的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
呈现零行?
答案 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>