【问题标题】:Silverlight User control events and MVVMSilverlight 用户控制事件和 MVVM
【发布时间】:2012-08-12 10:37:14
【问题描述】:

对 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 更改为“编辑”时,我想在电话应用程序栏中添加一个“保存”按钮,当单击“保存”按钮时,我想从用户控件中保存文本。我还想禁用“读取”视图中的保存按钮。 (即当 TextMode 为 'Read' 时)

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

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

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

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

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

【问题讨论】:

    标签: silverlight windows-phone-7 design-patterns mvvm user-controls


    【解决方案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/

    【讨论】:

      【解决方案2】:

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

      MVVM 的目的是将您的业务逻辑与 UI 分离。因此 MVVM 并不是要虔诚地避免代码隐藏。事实上,其中一个危险是试图将过多的责任强加给 View Model,以免使用背后的代码。

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

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

      【讨论】:

        猜你喜欢
        • 2010-10-31
        • 1970-01-01
        • 2011-10-02
        • 1970-01-01
        • 1970-01-01
        • 2011-02-21
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        相关资源
        最近更新 更多