我正在编写C#WPF应用程序。我是新手并尝试将List加载到DataGrid并失败。然后我使用DataGridView为我的WPF解决方案添加了一个WinForm。 当我将列表加载到DataGridView.DataSource时,我没有' *'即使AllowUserToAddRows属性为True,我添加新行,我将List转换为BindingList,现在仍然是新行。我到处搜索,但每个人都说BindingList解决了他们的问题。是因为它是WPF应用程序中的WinForm吗? 我该如何解决这个问题?
答案 0 :(得分:0)
专注于使用WPF,winforms插件可以工作,但是由于该过程的特殊性,它确实不是最佳的。
这是我创建的一个基本示例,它绑定到一个公共列表数组。您可以使用ObservableCollection或简单的通用列表。在WPF中,主要定义xaml中的外观,然后将数据绑定到该外观。 ItemsSource
是将项目放入要显示的数据网格的标准方法。
Window.Resources>
<model:People x:Key="People">
<model:Person First="Joe" Last="Smith" Phone="303-555 5555" />
<model:Person First="Mary" Last="Johnson" Phone="720-555 5555" />
<model:Person First="Frank" Last="Wright" Phone="202-555 5555" />
</model:People>
</Window.Resources>
<DataGrid AutoGenerateColumns="False"
ItemsSource="{StaticResource People}">
<DataGrid.Columns>
<DataGridTextColumn Header="First" Binding="{Binding First}" />
<DataGridTextColumn Header="The Name" Binding="{Binding Last}" />
<DataGridTextColumn Header="Phone Number" Binding="{Binding Phone}"/>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<TextBlock Text="{Binding Phone}" />
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
结果是带有行模板的列表,该模板在点击时打开:
现在很可能你不会像我所示那样使用Xaml中定义的静态资源进行绑定,而是将一个实现INotifyPropertyChanged
的VM(ViewModel)类实例放置并创建一个 People < / em> property。
可以从页面的数据上下文中访问VM,因为它很可能在后面的代码中实例化,例如
public MyPage()
{
InitializeComponent();
DataContext = new MyPageViewModel(); // Contains logic for the 'People' Property of a list of people.
}
}
然后在上面的示例中更改绑定以绑定到页面的datacontext ,这是从页面中删除的,因为没有为数据网格控件设置。
<DataGrid AutoGenerateColumns="False"
ItemsSource="{Binding People}">
有关完整的MVVM示例,请参阅我的博客Xaml: ViewModel Main Page Instantiation and Loading Strategy for Easier Binding
答案 1 :(得分:0)
好的我修复了它,绑定对象的默认构造函数不公开。 在途中,我使用ItemsSource将其与WPF DataGrid绑定(这很奇怪,因为我在使用列标题之前尝试了它,列表中项目数量的行,但行中没有数据。但如果它有效,请不要碰它:)) 谢谢大家。