gpt4 book ai didi

c# - 从 ViewModel 通知用户并取消导航

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

我有一个包含项目列表的 View ,即 TextBox和一个保存按钮。 TextBox绑定(bind)到列表中当前选定项的属性。 DataSource列表中的一个绑定(bind)到 ObservableCollection<T>在 View 模型中。
现在,当用户选择列表中的另一个项目并且尚未将更改保存到 TextBox ,应该问他是否要放弃他所做的更改。只有当他回答"is"时,才应更改列表中的选定项目。
我遇到的问题是:
我需要检查 ViewModel 中的更改,但我不知道当所选项目发生更改时,ViewModel 不会收到通知。

我想出了以下方法,但它似乎并不干净:
有事件SelectedItemsChanging在名单上。我可以使用 EventToCommand行为并通过 CancelEventArgs作为命令的参数。在命令中,我检查项目是否已更改,如果是,我可以使用信使发送 View 监听的消息。然后 View 将向用户显示确认对话框,并以某种方式将结果返回给 ViewModel。 ViewModel 依次设置 ​​Cancel事件 args 的属性为 true如果用户不想放弃他的更改。
这对我来说看起来并不干净,因为它将这个简单的功能分开并将其涂抹在三个文件上,使其非常难以理解。
对于这种情况,是否有任何最佳实践?

最佳答案

我会对模型类进行脏检查。下面的例子:

Public m_dirtyFields As New Dictionary(Of String, String)

Private Sub AddDirtyField(ByVal ColName As String, ByVal OrigValue As String)
If Not m_dirtyFields.ContainsKey(ColName) Then
m_dirtyFields.Add(ColName, OrigValue)
OnPropertyChanged("IsDirty")
End If
End Sub
Private Sub RemoveDirtyField(ByVal ColName As String)
If m_dirtyFields.ContainsKey(ColName) Then
m_dirtyFields.Remove(ColName)
End If
OnPropertyChanged("IsDirty")
End Sub

Private Sub OnAddress1Changing(ByVal value As String)
If Not m_dirtyFields.ContainsKey("Address1") Then
AddDirtyField("Address1", Address1)
Else
If m_dirtyFields("Address1") = value Then RemoveDirtyField("Address1")
End If
End Sub

Public ReadOnly Property IsDirty
Get
If _Initialized = False Then
m_dirtyFields.Clear()
_Initialized = True
End If

If m_dirtyFields.Count > 0 Then
Return True
Else : Return False
End If
End Get
End Property

上面的示例检查属性值,根据原始值的相似性将它们添加到字典中,并根据字典中的项目返回 Dirty。

在您的 ViewModel 中,您只需检查 MyObject.IsDirty ,如果更改,弹出一个消息框,要求用户保存(或不保存)。

此外,您可以在记录脏时禁用列表框(因此用户无法更改记录),但在 ViewModel 上有一个属性,该属性会宣传 SelectedItem 的脏属性。

关于c# - 从 ViewModel 通知用户并取消导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7285455/

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