【发布时间】:2019-10-13 02:04:16
【问题描述】:
大约两周前,我开始使用 WPF 进行开发,由于我只使用 WinForms 进行开发,因此遇到了一些常见问题,但设法找到了解决方案。但是,目前我遇到了一些问题:将具有多列的项目(通过 Visual Basic 代码,而不是 xaml)添加到列表视图中。
我不确定是否最好使用 Listview 或 DataGrid 控件,但基本上我希望用户能够将喜爱的歌曲添加到列表中,将它们保存到文件并在应用程序时加载文件被打开。列表视图目前有三列:艺术家、歌曲和状态。
当我在 WinForms 中编程时,我曾经这样做过:
Dim Song As New ListViewItem
Form1.ListView1.Items.Add(Song)
Song.Text = TextBox1.Text
Song.SubItems.Add(TextBox2.Text)
Song.SubItems.Add(TextBox3.Text)
然后,保存:
Dim Song As New ListViewItem
Form1.ListView1.Items.Add(Song)
Song.Text = TextBox1.Text
Song.SubItems.Add(TextBox2.Text)
Song.SubItems.Add(TextBox3.Text)
Try
Dim myWriter As New IO.StreamWriter(PATH_DATABASE)
For Each myItem As ListViewItem In Form1.ListView1.Items
myWriter.WriteLine(myItem.Text & "|" & myItem.SubItems(1).Text & "|" & myItem.SubItems(2).Text & "|" & myItem.SubItems(3).Text
Next
myWriter.Close()
Catch ex As Exception
MsgBox("Error: " & ex.Message, vbCritical, "Error")
End Try
我一直在寻找,我发现我需要使用绑定,所以我尝试了这个:
Imports System
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports System.Windows
Public Structure Song
Public _artist As String
Public _title As String
Public _status As String
Property Artist() As String
Get
Return _artist
End Get
Set(ByVal Value As String)
_artist = Value
End Set
End Property
Property Title() As String
Get
Return _title
End Get
Set(ByVal Value As String)
_title = Value
End Set
End Property
Property Status() As String
Get
Return _status
End Get
Set(ByVal Value As String)
_status = Value
End Set
End Property
End Structure
Public Class WINDOW_AddSong
Dim songs As New ObservableCollection(Of Song)
Private Sub Button1_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click
Dim Song As New ListViewItem
For Each wnd As Window In Application.Current.Windows
If wnd.GetType Is GetType(MainWindow) Then
DirectCast(wnd, MainWindow).Listview1.Items.Add(Alimento)
Alimento.Content = New Song() With {._artist = "Lol", ._title = "Lol2", ._status = "Lol3"}
End If
Next
End Sub
End Class
在 XAML 列表视图中:
<GridViewColumn Header="Artist" DisplayMemberBinding="{Binding Artist}"/>
<GridViewColumn Header="Title" DisplayMemberBinding="{Binding Title}"/>
<GridViewColumn Header="Status" DisplayMemberBinding="{Binding Status}"/>
这可行,但我不确定这是否是 WPF 的做事方式。
但是,我被困在保存过程中:
Try
Dim myWriter As New IO.StreamWriter(PATH_DATABASE)
For Each wnd As Window In Application.Current.Windows
If wnd.GetType Is GetType(MainWindow) Then
For Each myItem As ListViewItem In DirectCast(wnd, MainWindow).Listview1.Items
myWriter.WriteLine(Song, Artist, Status)
Next
End If
Next
myWriter.Close()
Catch ex As Exception
MsgBox("Error: " & ex.Message, vbCritical, "Error")
End Try
这不起作用。 另外,PATH_DATABASE 只是一个目录。
总而言之,专家能否检查我的代码并检查我做的事情是否“正确”,如果可能,您能否帮助我完成保存和加载过程?
谢谢。
【问题讨论】:
-
有很多方法可以保存它,例如您可以使用一个简单的文本文件,然后为列表视图的每一“行”写一行,然后将每个“列”分开它带有逗号或类似的符号。您可以通过从文本文件中读取行来加载它,以逗号分隔,然后将每个项目放入它的“列”中。
-
@CruleD 嘿,在 WinForms 中这很容易,但在 WPF 中则要复杂得多......这是使用 WinForms 保存的文本文件:imgur.com/a/8KatsDD 每行代表每个项目。每个 |代表每一列
-
我检查了代码,它看起来与 WinForms 相同。您对哪一部分有问题?
-
好吧,所以我检查了更多,想法是创建一个“DataTable”并将其绑定到 ListView 作为 DataSource 至少这是人们建议的,因为没有像 winforms 这样的子项。
-
只是对你的结构的一个附注......像
Public _artist As String这样的支持者字段不应该是公开的。 Private 是正确的 类的数据只能由属性过程设置,不能直接从类外设置。
标签: wpf vb.net listview binding items