【问题标题】:View and Model data formats查看和模型数据格式
【发布时间】:2014-11-13 14:35:27
【问题描述】:

如何定义要在视图和模型中使用的数据格式?

我清楚地理解这里的 ViewModel 是什么从 Model 中获取数据,将其转换(如果需要)并提供给 View(以及相反的方向):

用户 格式化数据(转换器) 视图 转换后的数据(供通用视图使用) ViewModel 原始数据 型号

现在我的问题是什么?我想将 OperationProgress 从模型传递到视图:

class OperationStep
{
    string _name;
    bool _isError;
    int _time;
    ...
}

class OperationProgress
{
    List<OperationStep> _steps;
    OperationStep _currentStep;
    // int _currentStepIndex;
    int _currentStepTime;
    ...
}

ViewModel 将OperationProgress 转换为一组可绑定属性(List&lt;bool&gt; 错误、当前步骤名称和时间倒计时),View 使用它们(和转换器!)向用户显示进度。

我愿意创建一个专门的控件来处理进度显示,以避免 ViewModels 中相同的可重复数据转换为原始类型

但我不知道如何为控件定义数据格式...直接在View 控件中使用OperationProgress(将其暴露在 ViewModel 中并绑定到它)?创建ControlProgress(专门用于控制的进度数据)?但是,如果 ViewModel 必须将 OperationProgress 转换为 ControlProgress 有什么好处呢?在模型中使用ControlProgress(感觉不对)。

所以我来了。如果你们会做类似的事情(传递一堆数据,而不仅仅是 stringint,从模型到视图或相反方向)你会如何组织它?

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    您必须决定是否可以简单地使用以OperationProgress 类型为目标的DataTemplate,或者是否必须为OperationProgress 创建一个完整的MVVM 堆栈。这取决于数据的复杂性,以及与数据的交互。

    编辑:

    你说:

    我愿意创建一个专门的控件来处理进度显示,以避免在 ViewModels 中将相同的可重复数据转换为原始类型。

    但据我所知,您想要的不仅仅是Control,而是完整的MVVM 堆栈,以便从OperationProgressControlProgress 的转换也封装在您的新VM 中。

    因此,您所说的“处理进度显示的专用控件” 将变为 OperationProgressView“ControlProgress” 将变为 OperationProgressViewModel

    【讨论】:

    • 我想创建一个“非常复杂” UserControl(具有一些可绑定属性以绑定到ViewModel 给出的进度数据)。 DataTemplate 如果我需要将它与代码结合起来,可能效果不佳。
    • 那我觉得你应该把它当成普通的MVVM栈(OperationProgressView/OperationProgressViewModel)
    • 也许我仍然认为winforms 方式。我没有想过在我的控制下拥有专用的 ViewModel。不得不考虑一下。您能否说明拥有该 ViewModel 会有什么帮助?或者如果你有进展(比如我的OperationProgress)并且必须在没有窗口的 ViewModel 进行转换的情况下向用户展示一些东西(我试图避免这种情况),也许可以自己实现。
    • @Sinatr 编辑了我的答案
    • 我现在明白了,谢谢。将代码从许多 ViewModel 移动到其中一个控件中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2011-03-19
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    相关资源
    最近更新 更多