0

对 MVVM 和用户控制事件有点困惑。

我认为我有一个用户控件。它有两种模式,即阅读和编辑。(文本模式)

<Grid
        x:Name="LayoutRoot"
        Background="Transparent">


                <controls:MyUserControl 
                             Mode="{Binding Path=TextMode,Mode=TwoWay}"
                             Text="{Binding Path=ReportText,Mode=TwoWay}"

                </controls:MyUserControl>         

</Grid>

当 TextMode 更改为 'Edit' 时,我想向电话应用程序栏添加一个 'Save' 按钮,当单击 Save 按钮时,我想从用户控件中保存文本。我还想禁用“读取”视图中的保存按钮。(即当 TextMode 为“读取”时)

执行此操作的正确 MVVM 方法是什么?我想到了两种方法:

1)我正在考虑在用户控件上公开 ModeChanged 属性并将其传播到视图,然后添加“保存”按钮。(但这是否违背了 MVVM 方式,即在代码中包含代码?)。

2) 处理依赖属性本身的propertychanged,并从用户控件添加保存按钮。(似乎不正确,因为应用程序逻辑混合在用户控件中)

我如何让视图模型参与其中?

什么是遵循 MVVM 进行此类操作的好方法。

4

2 回答 2

1

ApplicationBar 不是 DependencyObject,因此不能进行数据绑定。因此,在这方面纠结于 MVVM 的细节是没有意义的。

MVVM 的目的是将您的业务逻辑与 UI 分离。因此 MVVM 并不是要虔诚地避免代码隐藏。事实上,危险之一是试图在视图模型上施加太多责任,以免使用背后的代码。

最后要考虑的一件事是,如果您选择这样做,那么打破万能的 MVVM 模式只是一个问题,如果其他人必须弄清楚您做了什么。大多数开发团队会在用尽所有其他可能性(并浪费半小时或更长时间)后在代码隐藏中寻找代码。但是,在 ApplicationBar 的情况下,没有其他地方可以。

简而言之,您的第一个选项没有任何问题。

于 2012-08-16T06:21:07.263 回答
1

看看Phone7.Fx 中的BindableApplicationBar。它是更“MVVM 友好”的应用程序栏的包装器。

http://blog.humann.info/post/2010/08/27/How-to-have-binding-on-the-ApplicationBar.aspx

http://phone7.codeplex.com/

http://bindableapplicationb.codeplex.com/

于 2012-08-16T16:54:06.770 回答