在第一次更改ViewModel.ReceiveWarehouseID
后,无法找到查看更新ViewModel.Quantity
的原因?
当表单打开值正常时。如果RadSpinEditorQuantity
的值已更改,则RadDropDownListWarehouses
的SelectedValue将更改为0
如果RadDropDownListWarehouses
的SelectedValue先改变了 - 那么一切都正常。
之前我使用过与ViewModels和RadDropDownList控件相同的方法,从未注意到这种行为
这里是Form和ViewModel的完整代码 - 完整,因为我没有找到任何可以更改ReceiveWarehouseID
值的代码。
查看(RadForm)
Public Sub New(viewmodel As Object)
Me.InitializeComponent()
Me.BindingSourceViewModel.DataSource = viewmodel
Me.InitializeDataBindings()
End Sub
Private Sub InitializeDataBindings()
Me.RadLabelDescription.DataBindings.Add("Text",
Me.BindingSourceViewModel,
"ItemDescription",
True,
DataSourceUpdateMode.Never)
With Me.RadSpinEditorQuantity.DataBindings
.Add("Value", Me.BindingSourceViewModel, "Quantity", True)
.Add("Minimum", Me.BindingSourceViewModel, "MinQuantity", True)
.Add("Maximum", Me.BindingSourceViewModel, "MaxQuantity", True)
End With
With Me.RadDropDownListWarehouses
.DisplayMember = "Name"
.ValueMember = "ID"
.FormattingEnabled = True
.DataMember = "WarehouseList"
.DataSource = Me.BindingSourceViewModel
.DataBindings.Add("SelectedValue",
Me.BindingSourceViewModel,
"ReceiveWarehouseID",
True,
DataSourceUpdateMode.OnPropertyChanged)
End With
End Sub
ViewModel(实施INotifyPropertyChanged
)
Public Sub New(original As OriginalRowViewModel)
_Original = original
_Model = New RowTransfer() 'Here _Model.ReceiveWarehouseID set = 1
Me.WarehouseList = Warehouse.GenerateList()
End Sub
Private _Original As OriginalRowViewModel
Private _Model As RowTransfer
Public Property Quantity As Decimal
Get
Return _Model.Quantity
End Get
Set(ByVal value As Decimal)
If _Model.Quantity= value Then Exit Property
_Model.Quantity= value
Me.RaisePropertyChanged(Function() Me.Quantity)
End Set
End Property
Public Property ReceiveWarehouseID As Integer
Get
Return _Model.ReceiveWarehouseID
End Get
Set(ByVal value As Integer)
If _Model.ReceiveWarehouseID= value Then Exit Property
_Model.ReceiveWarehouseID= value
Me.RaisePropertyChanged(Function() Me.ReceiveWarehouseID)
End Set
End Property
Public ReadOnly Property ItemDescription As String
Get
Return _Original.ItemDescription
End Get
End Property
Public ReadOnly Property MaxQuantity As Decimal
Get
Return _Original.FreeQuantity
End Get
End Property
Public ReadOnly Property MinQuantity As Decimal
Get
Return 1D
End Get
End Property
Public Property WarehouseList As List(Of Warehouse)
更新
如果我将仓库列表直接设置为RadDropDownList
而没有BindingSource
RadDropDownList.DataSource = Warehouse.GenerateList()'
或者,如果我从Me.RaisePropertyChanged(Function() Me.PropertyName)
和Quantity
的制定者中移除ReceiveWarehouseID
然后,每个人都可以正常工作
但是没有想要这样做,因为在WPF窗口中将使用相同的ViewModel。我尝试制作适用于所有视图的ViewModel(Winforms和WPF) - 保留ViewModel中的仓库列表
Application.exe!Application.ViewModels.RowTransferViewModel.set_ReceiveWarehouseID(Integer value = 0)
[Native to Managed Transition]
[Managed to Native Transition]
System.dll!System.SecurityUtils.MethodInfoInvoke(System.Reflection.MethodInfo method, object target, object[] args)
System.dll!System.ComponentModel.ReflectPropertyDescriptor.SetValue(object component = {Application.ViewModels.RowTransferViewModel}, object value = 0)
System.Windows.Forms.dll!System.Windows.Forms.BindToObject.SetValue(object value)
System.Windows.Forms.dll!System.Windows.Forms.Binding.PullData(bool reformat, bool force)
System.Windows.Forms.dll!System.Windows.Forms.Binding.Target_PropertyChanged(object sender, System.EventArgs e)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.RadDropDownList.OnSelectedValueChanged(object sender, int newIndex, object oldValue, object newValue)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.RadDropDownList.element_SelectedValueChanged(object sender, Telerik.WinControls.UI.Data.ValueChangedEventArgs e)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.RadDropDownListElement.OnSelectedValueChanged(object sender, Telerik.WinControls.UI.Data.ValueChangedEventArgs e)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.RadDropDownListElement.NotifyOwner(Telerik.WinControls.UI.PopupEditorNotificationData notificationData)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.PopupEditorElement.listElement_SelectedValueChanged(object sender, System.EventArgs e)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.RadListElement.OnSelectedValueChanged(int newIndex)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.RadListElement.OnSelectedIndexChanged(int newIndex)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.RadListElement.HandleSelectOne(int newIndex)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.RadListElement.ProcessSelection(int newIndex, bool onMouseDrag, Telerik.WinControls.UI.InputType inputType, int dir)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.RadListElement.dataLayer_CurrentPositionChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.ListDataLayer.OnCurrentPositionChanged(int newPosition)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.ListDataLayer.CollectionView_CurrentChanged(object sender, System.EventArgs e)
Telerik.WinControls.dll!Telerik.WinControls.Data.RadCollectionView<System.__Canon>.OnCurrentChanged(System.EventArgs args)
Telerik.WinControls.dll!Telerik.WinControls.Data.RadCollectionView<Telerik.WinControls.UI.RadListDataItem>.SetCurrentPositionCore(int newPosition, bool forceNotify, Telerik.WinControls.CurrentChangeReason reason)
Telerik.WinControls.dll!Telerik.WinControls.Data.RadListSource<System.__Canon>.currencyManager_PositionChanged(object sender, System.EventArgs e)
System.Windows.Forms.dll!System.Windows.Forms.CurrencyManager.OnPositionChanged(System.EventArgs e)
System.Windows.Forms.dll!System.Windows.Forms.CurrencyManager.ChangeRecordState(int newPosition, bool validating, bool endCurrentEdit, bool firePositionChange, bool pullData)
System.Windows.Forms.dll!System.Windows.Forms.CurrencyManager.Position.set(int value)
System.Windows.Forms.dll!System.Windows.Forms.BindingSource.Position.set(int value)
System.Windows.Forms.dll!System.Windows.Forms.BindingSource.ParentCurrencyManager_CurrentItemChanged(object sender, System.EventArgs e)
System.Windows.Forms.dll!System.Windows.Forms.CurrencyManager.OnCurrentItemChanged(System.EventArgs e)
System.Windows.Forms.dll!System.Windows.Forms.CurrencyManager.List_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e)
System.Windows.Forms.dll!System.Windows.Forms.BindingSource.OnListChanged(System.ComponentModel.ListChangedEventArgs e)
System.Windows.Forms.dll!System.Windows.Forms.BindingSource.InnerList_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e)
System.dll!System.ComponentModel.BindingList<System.__Canon>.OnListChanged(System.ComponentModel.ListChangedEventArgs e)
System.dll!System.ComponentModel.BindingList<Application.ViewModels.RowTransferViewModel>.Child_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
Application.exe!Application.ViewModels.ViewModelBase.RaisePropertyChanged(Of Decimal)(System.Linq.Expressions.Expression(Of System.Func(Of Decimal)) kentta = {System.Linq.Expressions.Expression(Of System.Func(Of Decimal))})