【问题标题】:Design Time Data Interface Implementation设计时数据接口实现
【发布时间】:2016-10-22 13:02:39
【问题描述】:

我有一个像这样的 ViewModel 类

public class MyViewModel : ViewModelBase
{
    public MyViewModel()
    {
        if (!IsInDesignMode)
        {
            throw new InvalidOperationException();
        }
    }

    public MyViewModel(IDataProvider dataProvider)
    {
        Data = new ObservableCollection<IData>(dataProvider.GetData());
    }

    public ObservableCollection<IData> Data { get; private set; }
}

现在我想创建一些设计时数据。在我的单元测试中,我使用模拟框架 (Moq) 来执行此操作。我不喜欢我需要在我的 App 项目中创建一些 IData 的 Mock 实现或引用和使用 Mocking 框架的事实。

在这种情况下获得设计时数据的最优雅的方法是什么?

编辑:不确定是否相关,但我使用的是 Visual Studio 2012。

【问题讨论】:

    标签: c# wpf mvvm design-time design-time-data


    【解决方案1】:

    基本上,您创建一个存根,而不是设计时数据的模拟。存根不能注入任何依赖项。

    public class MyDesignViewModel : ViewModelBase
    {
        public MyViewModel()
        {
            Data = new ObservableCollection<IData>(new List<IData>() 
            {
                 new MyData() { Value1 = 1, Value2 = "Test" },
                 ...
            });
        }
    
        public ObservableCollection<IData> Data { get; private set; }
    }
    

    然后像这样在 XAML 中使用它:

    <UserControl x:Class="MyView"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DataContext="{d:DesignInstance Type=vm:MyDesignViewModel, IsDesignTimeCreatable=True}">
    

    【讨论】:

    • 所以在我的应用程序项目中创建两个新类MyDesignViewModelMyData没有什么神奇的方法,对吗?
    • 只需MyDesignViewModel,对于MyData,您可以使用您现有的实现(我从发布的代码中看不到它,只看到接口),如果您的实现不需要任何依赖关系(在所有情况下,没有理由在 98% 的情况下应该这样做)。其他一切最终都会混合关注点(与 ViewModel 实际任务无关的依赖关系或紧密耦合)或系统过于放松(即通过允许使用无参数构造函数实例化 ViewModel)。您的 DesignViewModel 可以驻留在与您的视图模型不同的程序集中,仅供您的 UI 设计师使用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    相关资源
    最近更新 更多