将 ObservableCollection<T> ItemSource 绑定到 DataGrid
Binding ObservableCollection<T> ItemSource to DataGrid
在我的 wpf 应用程序中,我使用 Prism 库将我的视图模型自动连接到我的视图中。我有这个工作用于自动绑定视图和模型的简单属性。现在我正在尝试绑定一个 ObservableCollection<T>
数据以绑定到 DataGrid
中,但没有成功。以下是我当前场景的结构。
ConfigurationDetails.cs
public class ConfigurationDetails:BindableBase
{
private int _id;
public int Id { get { return _id; } set { SetProperty(ref _id, value); } }
private string _configFName;
private string _configSName;
private string _configUName;
public string ConfigFName { get { return _configFName; } set { SetProperty(ref _configFName, value); } }
public string ConfigSName { get { return _configSName; } set { SetProperty(ref _configSName, value); } }
public string ConfigUName { get { return _configUName; } set { SetProperty(ref _configUName, value); } }
}
ConfigurationWindowViewModel.cs
public class ConfigurationWindowViewModel : BindableBase
{
public ConfigurationWindowViewModel()
{
ConfigDetails = new ObservableCollection<ConfigurationDetails>();
}
private ObservableCollection<ConfigurationDetails> _configDetails;
public ObservableCollection<ConfigurationDetails> ConfigDetails { get { return _configDetails; } set { SetProperty(ref _configDetails, value); } }
}
ConfigurationWindow.xaml
<UserControl x:Class="MyApp.Views.ConfigurationWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
HorizontalContentAlignment="Center">
....
<DataGrid ItemsSource="{Binding ConfigDetails}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="F NAME" Width="*" Binding="{Binding Path=ConfigFName}"/>
<DataGridTextColumn Header="S NAME" Width="*" Binding="{Binding Path=ConfigSName}"/>
<DataGridTextColumn Header="U NAME" Width="*" Binding="{Binding Path=ConfigUName}"/>
</DataGrid.Columns>
</DataGrid>
....
</UserControl>
ConfigurationWindow.xaml.cs
public ConfigurationWindow()
{
InitializeComponent();
using (_db = new MyEntities())
{
var configRecords = _db.tblConfigs.ToList().Select(x => new ConfigurationDetails()
{
ConfigFName = x.ConfigFName,
ConfigSName = x.ConfigSName,
ConfigUName = x.ConfigUName,
Id = x.ConfigID
});
model.ConfigDetails = new ObservableCollection<ConfigurationDetails>(configRecords);
//model.ConfigDetails will have records assigned to it when debugged
}
}
}
但是,我仍然没有在 DataGrid
中看到任何记录。这里缺少什么。我还使用了 ViewModelLocator.AutoWireViewModel
并且它对其他模型属性一直完美无缺。希望在这里得到一些帮助。
更新 - 我的 ConfigurationWindowViewModel.cs
放在 ViewModels
文件夹中。很抱歉错过了。
您要在何处将 ConfigurationDetails 对象添加到 ConfigDetails 集合?尝试在 ConfigurationWindowViewModel 的构造函数中添加一些项目 class:
public class ConfigurationWindowViewModel : BindableBase
{
public ConfigurationWindowViewModel()
{
ConfigDetails = new ObservableCollection<ConfigurationDetails>();
//add some items...:
ConfigDetails.Add(new ConfigurationDetails() { ConfigFName = "F", ConfigSName = "S", ConfigUName = "U" });
ConfigDetails.Add(new ConfigurationDetails() { ConfigFName = "F", ConfigSName = "S", ConfigUName = "U" });
ConfigDetails.Add(new ConfigurationDetails() { ConfigFName = "F", ConfigSName = "S", ConfigUName = "U" });
}
private ObservableCollection<ConfigurationDetails> _configDetails;
public ObservableCollection<ConfigurationDetails> ConfigDetails { get { return _configDetails; } set { SetProperty(ref _configDetails, value); } }
}
要使 Prism 中的自动装配功能开箱即用,您需要遵循默认命名约定,即您的 ConfigurationWindowViewModel class 应位于 "ViewModels" 文件夹中(和 .ViewModels 命名空间中)在项目的根文件夹中。请参阅 Brian Lagunas 的博客 post 了解更多信息,以及如何通过调用 Bootstrapper 中的 ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver 方法或 App.xaml.cs 来更改默认约定:http://brianlagunas.com/getting-started-prisms-new-viewmodellocator/
还要确保您实现了 IView 接口:
public partial class ConfigurationWindow() : Window, IView
{
...
}
嗯...首先,ObservableCollection 实现了 INotifyPropertyChanged,因此您不必那样做。
那就够了:
public ObservableCollection<ConfigurationDetails> ConfigDetails { get; set; }
public ConfigurationWindow()
{
InitializeComponent();
using (_db = new MyEntities())
{
var configRecords = _db.tblConfigs.ToList().Select(x => new ConfigurationDetails()
{
ConfigFName = x.ConfigFName,
ConfigSName = x.ConfigSName,
ConfigUName = x.ConfigUName,
Id = x.ConfigID
});
foreach(var config in configRecords)
{
model.ConfigDetails.Add(config);
}
}
}
}
在我的 wpf 应用程序中,我使用 Prism 库将我的视图模型自动连接到我的视图中。我有这个工作用于自动绑定视图和模型的简单属性。现在我正在尝试绑定一个 ObservableCollection<T>
数据以绑定到 DataGrid
中,但没有成功。以下是我当前场景的结构。
ConfigurationDetails.cs
public class ConfigurationDetails:BindableBase
{
private int _id;
public int Id { get { return _id; } set { SetProperty(ref _id, value); } }
private string _configFName;
private string _configSName;
private string _configUName;
public string ConfigFName { get { return _configFName; } set { SetProperty(ref _configFName, value); } }
public string ConfigSName { get { return _configSName; } set { SetProperty(ref _configSName, value); } }
public string ConfigUName { get { return _configUName; } set { SetProperty(ref _configUName, value); } }
}
ConfigurationWindowViewModel.cs
public class ConfigurationWindowViewModel : BindableBase
{
public ConfigurationWindowViewModel()
{
ConfigDetails = new ObservableCollection<ConfigurationDetails>();
}
private ObservableCollection<ConfigurationDetails> _configDetails;
public ObservableCollection<ConfigurationDetails> ConfigDetails { get { return _configDetails; } set { SetProperty(ref _configDetails, value); } }
}
ConfigurationWindow.xaml
<UserControl x:Class="MyApp.Views.ConfigurationWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
HorizontalContentAlignment="Center">
....
<DataGrid ItemsSource="{Binding ConfigDetails}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="F NAME" Width="*" Binding="{Binding Path=ConfigFName}"/>
<DataGridTextColumn Header="S NAME" Width="*" Binding="{Binding Path=ConfigSName}"/>
<DataGridTextColumn Header="U NAME" Width="*" Binding="{Binding Path=ConfigUName}"/>
</DataGrid.Columns>
</DataGrid>
....
</UserControl>
ConfigurationWindow.xaml.cs
public ConfigurationWindow()
{
InitializeComponent();
using (_db = new MyEntities())
{
var configRecords = _db.tblConfigs.ToList().Select(x => new ConfigurationDetails()
{
ConfigFName = x.ConfigFName,
ConfigSName = x.ConfigSName,
ConfigUName = x.ConfigUName,
Id = x.ConfigID
});
model.ConfigDetails = new ObservableCollection<ConfigurationDetails>(configRecords);
//model.ConfigDetails will have records assigned to it when debugged
}
}
}
但是,我仍然没有在 DataGrid
中看到任何记录。这里缺少什么。我还使用了 ViewModelLocator.AutoWireViewModel
并且它对其他模型属性一直完美无缺。希望在这里得到一些帮助。
更新 - 我的 ConfigurationWindowViewModel.cs
放在 ViewModels
文件夹中。很抱歉错过了。
您要在何处将 ConfigurationDetails 对象添加到 ConfigDetails 集合?尝试在 ConfigurationWindowViewModel 的构造函数中添加一些项目 class:
public class ConfigurationWindowViewModel : BindableBase
{
public ConfigurationWindowViewModel()
{
ConfigDetails = new ObservableCollection<ConfigurationDetails>();
//add some items...:
ConfigDetails.Add(new ConfigurationDetails() { ConfigFName = "F", ConfigSName = "S", ConfigUName = "U" });
ConfigDetails.Add(new ConfigurationDetails() { ConfigFName = "F", ConfigSName = "S", ConfigUName = "U" });
ConfigDetails.Add(new ConfigurationDetails() { ConfigFName = "F", ConfigSName = "S", ConfigUName = "U" });
}
private ObservableCollection<ConfigurationDetails> _configDetails;
public ObservableCollection<ConfigurationDetails> ConfigDetails { get { return _configDetails; } set { SetProperty(ref _configDetails, value); } }
}
要使 Prism 中的自动装配功能开箱即用,您需要遵循默认命名约定,即您的 ConfigurationWindowViewModel class 应位于 "ViewModels" 文件夹中(和 .ViewModels 命名空间中)在项目的根文件夹中。请参阅 Brian Lagunas 的博客 post 了解更多信息,以及如何通过调用 Bootstrapper 中的 ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver 方法或 App.xaml.cs 来更改默认约定:http://brianlagunas.com/getting-started-prisms-new-viewmodellocator/
还要确保您实现了 IView 接口:
public partial class ConfigurationWindow() : Window, IView
{
...
}
嗯...首先,ObservableCollection 实现了 INotifyPropertyChanged,因此您不必那样做。
那就够了:
public ObservableCollection<ConfigurationDetails> ConfigDetails { get; set; }
public ConfigurationWindow()
{
InitializeComponent();
using (_db = new MyEntities())
{
var configRecords = _db.tblConfigs.ToList().Select(x => new ConfigurationDetails()
{
ConfigFName = x.ConfigFName,
ConfigSName = x.ConfigSName,
ConfigUName = x.ConfigUName,
Id = x.ConfigID
});
foreach(var config in configRecords)
{
model.ConfigDetails.Add(config);
}
}
}
}