【问题标题】:MVVM - static ViewModelMVVM - 静态视图模型
【发布时间】:2015-06-17 11:28:37
【问题描述】:

我使用 MVVM 模式创建了一些应用程序。首先,我创建了几个视图(只显示了一个),它们都使用一个 ViewModel(其中包含一些 ListView 和其他属性使用的 List)

<UserControl.DataContext>
  <ViewModels:UniversalViewModel />
</UserControl.DataContext>

现在我的应用程序需要显示相同的数据,但分成几个屏幕。我的意思是我每个屏幕检索例如 12 行数据,我从静态 Config 类中读取我有 2 个屏幕,因此默认主窗口打开(它包含一些作为内容的视图)并且其他外部窗口也打开(它包含相同仅查看另一个实例)。累积我检索 2*12=24 行数据,我想在第一个屏幕上显示前 12 行,在第二个屏幕上显示最后 12 行(偏移量)。

我的想法是创建值转换器,它将跳过 x 行数据并检索 y 行

ItemsSource="{Binding ArrivalDepartures, Converter={.....}}"

但是如何确定转换器需要跳过多少行(ViewModel 是静态类,因此它不能包含屏幕指定的数据)。

【问题讨论】:

  • 为什么你的视图模型是静态类?
  • 因为每个视图都使用相同的数据,但只使用它的其他部分(例如,第一个屏幕显示前 12 行,下一个屏幕显示接下来的 12 行等)。如果您有更好的主意,我将不胜感激:)
  • 他们没有显示相同的数据,是吗?为什么不创建视图模型的多个实例 - 一个包含前 12 行,一个包含接下来的 12 行?
  • @BoltClock 您可能无法将其分配为dataContext,但您可以通过{x:Static ...}在任何上下文中访问静态类
  • @Lukas 使用适当的 IoC 并在其中注册一个单例实例会更好。否则,您无法通过自动连接模拟实例和属性来测试您的配置。实际上,您正在做的事情限制了所有测试的可能性,并且是一个很大的反模式。

标签: c# wpf mvvm


【解决方案1】:

尝试将视图模型设置为静态资源,然后 DataContext={StaticResource VM}

【讨论】:

    【解决方案2】:

    使用 MultiBinding 转换器 (IMultiValueConverter.Convert) 并传入第二个参数,即每页所需行的跳过偏移值。跳过值可以传入/绑定到静态值或命名页面上可以提供该值的东西。

    <MultiBinding Converter="{converters:SkipRecords}">
       <Binding ArrivalDepartures />
       <Binding ElementName=tbTotalRows Path="Index"/>
    </MultiBinding>
    

    【讨论】:

      【解决方案3】:

      如果您想将您的类用作 Datacontext 创建一个“哑”实例并将该实例绑定到您的视图,您可以保持您的 ViewModel 静态 - 即所有类变量、属性和方法。 Datacontext 本身必须是一个实例 - 但当您的实例的(可绑定)属性是类拥有/静态时,这没问题。

      这取决于您是按需创建实例还是遵循单例模式并仅创建一个实例(并使其在静态 ClassProperty 中可访问。

      在最后一种情况下,实例本身是它自己的属性 - 小心!

      【讨论】:

        猜你喜欢
        • 2016-06-11
        • 2011-08-24
        • 2010-12-07
        • 2011-08-25
        • 2012-06-08
        • 1970-01-01
        • 1970-01-01
        • 2021-06-09
        • 2013-09-01
        相关资源
        最近更新 更多