gpt4 book ai didi

wpf - 使用 VB.Net MVVM (WPF) 通过 DataSet 从 ObservableCollection 加载 Combobox

转载 作者:行者123 更新时间:2023-12-03 10:43:02 25 4
gpt4 key购买 nike

第一次用WPF写,就遇到了这种情况:
我正在尝试使用数据集中的值加载组合框,而无需在代码隐藏中编写任何内容(根据 MVVM 方式)。我尝试过的很多事情都失败了。

这是最新的:

Public Class ChainTableModel
Dim _chainId As String
Dim _chainType As String

Public Property ChainId As String
Get
Return _chainId
End Get
Set(value As String)
_chainId = value
End Set
End Property

Public Property ChainType As String
Get
Return _chainType
End Get
Set(value As String)
_chainType = value
End Set
End Property

Public Sub New(chainId As String, chainType As String)
_chainId = chainId
_chainType = chainType
End Sub
End Class

View 模型:
Public Class ChainViewModel
Implements INotifyPropertyChanged
Dim _chainTypes As ObservableCollection(Of ChainTableModel) = New ObservableCollection(Of ChainTableModel)()

Public Property ChainTypes As ObservableCollection(Of ChainTableModel)
Get
If _chainTypes.Count = 0 Then DBLoadChains()
Return _chainTypes
End Get
Set(value As ObservableCollection(Of ChainTableModel))
_chainTypes = value
NotifyPropertyChanged("ChainTypes")
End Set
End Property

Private Sub DBLoadChains()
For Each row As DataRow In CatCollections.dsChains.Tables("ChainTable").Rows
Dim display As String = row("Name").ToString
Dim value As String = row("id").ToString
If display = String.Empty Then display = value
_chainTypes.Add(New ChainTableModel(value, display))
Next
End Sub

Private Sub NotifyPropertyChanged(propertyName As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub

Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
End Class

XAML:
<Window x:Class="ChainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CatLayoutTools"
Title="CatScript Layout Tools (WPF) - Chain Options" SizeToContent="WidthAndHeight" Height="Auto"
ResizeMode="NoResize" Width="Auto">

<Window.DataContext>
<local:ChainViewModel />
</Window.DataContext>

<Window.Resources>
<Style TargetType="GroupBox">
<Setter Property="Margin" Value="3,3,3,3" />
<Setter Property="Padding" Value="0,5,0,0" />
<Setter Property="VerticalAlignment" Value="Top" />
</Style>
</Window.Resources>

<StackPanel>
<ComboBox SelectedValuePath="id" ItemsSource="{Binding ChainTypes}" />
</StackPanel>
</Window>

当我运行代码时,组合框会填充以下文本“CatLayoutTools.ChainTableModel”的次数,因为数据库查询中有行。

我在这里想念什么?我正在尝试以 MVVM 方式完成组合框加载和选择当前项目:绑定(bind)到 ViewModel。

另外,我有一个问题:如您所见,我正在从“ChainTypes”属性 Get 中的 View 模型中的数据集中加载我的 observablecollection。不知何故,我认为这不是执行此操作的正确位置,但是如果我在 View 模型中放置一个构造函数,XAML 中的“”行会出错,告诉我对象未设置为...的实例

如果我从我的 AutoCAD 初始化子中处理 ObservableCollection 的加载,我如何保留 ObservableCollection 以供需要绑定(bind)到组合框时使用?

任何帮助表示赞赏。

谢谢

最佳答案

您没有指定 DisplayMemberPath。如果没有这个,将显示您的类型的默认 ToString() 实现的结果。 SelectedValuePath 也是错误的。

<ComboBox SelectedValuePath="ChainId" DisplayMemberPath="ChainType" ItemsSource="{Binding ChainTypes}" />

关于初始化...您的 View 模型中可能有初始化命令,然后将 View 中的 Loaded 事件绑定(bind)到该命令。有关如何在此处绑定(bind)事件的更多信息:

WPF event binding from View to ViewModel? .

不幸的是,我不明白最后一个问题。您将结果存储在 _chainTypes 字段中。

关于wpf - 使用 VB.Net MVVM (WPF) 通过 DataSet 从 ObservableCollection 加载 Combobox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45519092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com