gpt4 book ai didi

wpf - 正确的 MVVM 模式 WPF 命令实现

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

我正在尝试按照 MVVM 模式实现命令,但我被这种特殊情况所困扰。

在 XAML 中,我将命令绑定(bind)到列内的按钮:

<dxg:GridColumn FieldName="Delete" Header="" UnboundType="Object" Width="20" FixedWidth="True">
<dxg:GridColumn.EditSettings>
<dxe:ButtonEditSettings AllowDefaultButton="False">
<dxe:ButtonEditSettings.Buttons>
<dxe:ButtonInfo GlyphKind="Cancel" Command="{Binding DeleteRowCommand}" CommandParameter="{Binding ElementName=testView}" />
</dxe:ButtonEditSettings.Buttons>
</dxe:ButtonEditSettings>
</dxg:GridColumn.EditSettings>
</dxg:GridColumn>

在我的 ViewModel 中,我声明了一个 DelegateCommand:
Private m_deleteRowCommand As DelegateCommand(Of Object)
Public Property DeleteRowCommand() As DelegateCommand(Of Object)
Get
Return m_deleteRowCommand
End Get
Private Set(ByVal value As DelegateCommand(Of Object))
m_deleteRowCommand = value
End Set
End Property

我在 ViewModel 的构造函数中初始化了命令:
DeleteRowCommand = New DelegateCommand(Of Object)(AddressOf DeleteRowCommandExecute)

最后我执行命令:
Private Sub DeleteRowCommandExecute(ByVal parameter As Object)
Dim sender As TableView = parameter
Dim row = sender.DataControl.CurrentItem
Dim index = sender.FocusedRowHandle
sender.DeleteRow(index)
End Sub

一切都按预期工作,但据我所知,ViewModel 应该对 View 一无所知,因此删除 ViewModel 中的行是不正确的。

按照 MVVM 模式执行此操作的最佳方法是什么?

更新:
从绑定(bind)到 Grid 的 ItemsSource 的 ObservableCollection 中删除项目效果很好,但是如果我需要从没有 ItemsSource 的 Grid 中删除 UI 元素(如 StackPanel)怎么办?
<Grid>
<StackPanel>
<Button Content="Delete" Height="25" Width="100" Command="{Binding DeleteItemCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=StackPanel}}" />
</StackPanel>
</Grid>

更新2:
我的目标是拥有一个容器,我可以在其中动态添加项目(UserControl),并且我可以在运行时更改这些项目的顺序。
目前,我使用 Grid 作为容器,每次插入新项目时都会向其中添加新的 RowDefinition。
我使用 Grid.Row 属性来跟踪和更改项目的顺序。
这样我需要在后面的代码中执行所有删除操作,因为我必须从网格中手动删除 RowDefinition。

最佳答案

Deleting the item from the ObservableCollection binded to the ItemsSource of the Grid works perfectly, but what if I need to remove an UI element like a StackPanel from a Grid which don't have an ItemsSource?



由于此代码纯粹与 View 相关,因此应在 View 的代码隐藏中(或在应用它的控件本身)中实现。 View 模型不应该知道任何关于任何 UI 元素的信息,因此实现删除这些元素的命令是没有意义的。

MVVM 并不是要从 View 中消除与 View 相关的代码。它是关于关注点的分离。所以保留与 UIElements 相关的所有内容和 Panels在你看来。

关于wpf - 正确的 MVVM 模式 WPF 命令实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44885853/

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