获取 WPF 列表视图来显示 ObservableCollection使用数据绑定
我有一个项目类型的可观察集合,我想在 ListView 中显示它,但没有任何内容添加到我的 ListView 中,我真的不理解
我的 MainWindow.xaml
<ListView Name="ListViewProjects" Grid.Column="0" Grid.RowSpan="3" SelectionChanged="ListViewProjectsSelectionChanged" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" MinWidth="100">
<ListView.ItemTemplate>
<DataTemplate>
<WrapPanel>
<TextBlock Text="{Binding Path=ProjectID}"/>
<TextBlock Text="{Binding Path=ProjectName}"/>
</WrapPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
我的 MainWindow.cs
public partial class MainWindow : Window
{
ObservableCollection<Project> Projects = new ObservableCollection<Project>();
ObservableCollection<Employee> Employees = new ObservableCollection<Employee>();
public MainWindow()
{
InitializeComponent();
DataContext = Projects;
Project pro1 = new Project(1, "Swordfish");
Projects.Add(pro1);
Employee empMads = new Employee("Mads", 1);
Employee empBrian = new Employee("Brian", 2);
Employees.Add(empMads);
Employees.Add(empBrian);
}
private void ListViewProjectsSelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
}
和我的 Project.cs 这是类文件
[Serializable]
class Project : INotifyPropertyChanged
{
public Project(int id, string name)
{
ID = id;
Name = name;
}
private int id;
public int ID
{
get { return id; }
set
{
id = value;
NotifyPropertyChanged("ProjectID");
}
}
private string name;
public string Name
{
get { return name; }
set
{
name = value;
NotifyPropertyChanged("ProjectName");
}
}
[field: NonSerialized]
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
但什么也没有已添加到我的列表中,我看不到我缺少什么才能使其正常工作。
我把它作为一个可观察的集合 我做 DataContext = 集合 我在 xaml 文件中进行绑定
编辑代码部分 1:
public ObservableCollection<Project> Projects { get; set; }
public ObservableCollection<Employee> Employees { get; set; }
public MainWindow()
{
InitializeComponent();
Projects = new ObservableCollection<Project>();
Employees = new ObservableCollection<Employee>();
DataContext = Projects;
I have a observable collection of type Project, that I want to be displayed in a ListView but nothing is added to my ListView which I really dont understand
My MainWindow.xaml
<ListView Name="ListViewProjects" Grid.Column="0" Grid.RowSpan="3" SelectionChanged="ListViewProjectsSelectionChanged" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" MinWidth="100">
<ListView.ItemTemplate>
<DataTemplate>
<WrapPanel>
<TextBlock Text="{Binding Path=ProjectID}"/>
<TextBlock Text="{Binding Path=ProjectName}"/>
</WrapPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
My MainWindow.cs
public partial class MainWindow : Window
{
ObservableCollection<Project> Projects = new ObservableCollection<Project>();
ObservableCollection<Employee> Employees = new ObservableCollection<Employee>();
public MainWindow()
{
InitializeComponent();
DataContext = Projects;
Project pro1 = new Project(1, "Swordfish");
Projects.Add(pro1);
Employee empMads = new Employee("Mads", 1);
Employee empBrian = new Employee("Brian", 2);
Employees.Add(empMads);
Employees.Add(empBrian);
}
private void ListViewProjectsSelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
}
and my Project.cs which is the class file
[Serializable]
class Project : INotifyPropertyChanged
{
public Project(int id, string name)
{
ID = id;
Name = name;
}
private int id;
public int ID
{
get { return id; }
set
{
id = value;
NotifyPropertyChanged("ProjectID");
}
}
private string name;
public string Name
{
get { return name; }
set
{
name = value;
NotifyPropertyChanged("ProjectName");
}
}
[field: NonSerialized]
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
But nothing is added to my list I cant see what I am missing for it to work.
I have it as a observablecollection
I do DataContext = the collection
And I do binding in the xaml file
Edit codepart 1:
public ObservableCollection<Project> Projects { get; set; }
public ObservableCollection<Employee> Employees { get; set; }
public MainWindow()
{
InitializeComponent();
Projects = new ObservableCollection<Project>();
Employees = new ObservableCollection<Employee>();
DataContext = Projects;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这是因为您使用像
ProjectID
这样的绑定路径,而您的 Project 类具有属性ID
。ProjectName
和Name
属性也是如此。乙:
当您遇到绑定问题时,在 Visual Studio 的调试模式下查看“输出”选项卡以查看数据绑定引擎返回了哪些错误非常有用。这些异常通常不会返回给用户,但您可以在那里检查它们。
It's because you use binding path like
ProjectID
while your Project class has propertyID
. The same goes forProjectName
andName
properties.E:
When you have problems with binding it's very useful to look through
Output
tab in visual studio's debug mode to see what errors were returned from databinding engine. Those exceptions are normally not returned to user, but you can inspect them there.正如所指出的,这里存在一些问题。作为一名新的 WPF 开发人员,您遇到的“问题”之一是您不能使用成员变量,而必须使用公共属性:
当然,这些属性需要在构造函数中进行初始化。
完成此操作后,您需要确保集合的属性与您在 ListView 上绑定的属性相匹配。
As pointed out, there are a few problems here. One of the "gotchas" that get you as a new WPF developer is that you can't use member variables, you have to use public properties:
These, of course, need to be initialized in your constructor.
Once you do that, you need to make sure the properties of the collection match what you're binding to on the ListView.
默认情况下,您的成员变量将是私有的。如果您在此处发布的内容是您的实际代码,则 XAML 无法访问它。公开这些属性:
By default your member variables are going to be private. If what you have posted here is your actual code, then the XAML has no way of accessing it. Makes those properties public:
1.您的列表需要是公共属性(编辑:除非您像您一样设置 DataContext...) (
public ObservableCollectionProjects {get;}
)2.您的通知应该是与实际属性名称相同:
3.绑定也需要这样:
我认为......
1.Your list needs to be a public property (Edit: unless you set the DataContext like you did...) (
public ObservableCollection<Project> Projects {get;}
)2.Your notification should be the same as the actual property name:
3.The binding needs to be that way as well:
I think...