0

好的,这对我来说有点难以解释,所以我使用带有 WPF 的 MVVM 模型编写了一个程序。

我的主 UserControl 上有一个网格,它需要通过代码动态更新子项(通过更新我的意思是创建和销毁)(因为数据由 ViewModel 更改,我希望根据需要创建和销毁 Grid 的子项) .

我很确定您不能仅使用 XAML 动态创建和销毁 UIElement,因此我的视图中有更新函数(这些更新函数仅更新 UI 本身,它们不会更改 ViewModel 中的任何内容,因此我不会破坏 MVVM,因为代码在视图仅根据 ViewModel 中的数据更改 UI,这样可以吗?)。

现在我在 View 中分配 ViewModel 的 PropertyChanged 事件,并通过代码捕获它并触发 Update 事件,所以我的 View 类中的事件如下所示:

        private void ViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "BoardWidth" || e.PropertyName == "BoardHeight")
                RecreateBoard();

            if (e.PropertyName == "Coordinates")
                UpdateCoordinates();

            if (e.PropertyName == "TilesOnly")
            {
                UpdateBoardBlocks();
                UpdateTiles();
            }

            if (e.PropertyName == "BoardBlockViewModels")
                UpdateBoardBlocks();

            if (e.PropertyName == "TileViewModels")
                UpdateTiles();

            if (e.PropertyName == "EntryPoint" | e.PropertyName == "CursorViewModel")
                UpdateEntryPoint();
        }

更新事件使用基于 ViewModel 中数据的代码在视图的主网格中创建/销毁子项。当前的实现效果很好。

但是,我想通过 XAML 实现事件处理程序。所以我的问题是如何在 XAML 中实现上面的事件处理程序代码,当数据上下文属性更改时,我无法找到在视图中执行方法的任何方式。我研究了 DataTriggers 但它们不包含执行方法的能力。此外,DataTrigger 需要在属性更改时触发,而不是在将其设置为特定值时触发。

我不希望通过 ViewModel 推送更新,因为这完全是一个 View 事物,它与 viewmodel 本身无关。例如。在这些情况下,视图的不同实现可能不需要更新。即使我要通过 ViewModel 来推动它,视图本身仍然存在如何执行方法的相同问题。

谢谢您的帮助。

4

1 回答 1

1

我认为如果您在视图中需要那么多命令式代码,那么您的处理方式可能是错误的。在大多数情况下,您只需将数据绑定到列表和字段等。您很少需要创建和删除元素,您要么拥有控件自动生成它们(例如ItemsControls),要么重用现有实例。

如果您确实需要执行此类动态操作,最好将该逻辑封装在UserControls自定义控件中,只需提供可以绑定的属性(在内部您可以处理依赖属性的值更改事件以进行任何更新)。

视图中剩下的应该是对这些控件的绑定。

于 2012-07-13T00:41:42.430 回答