【问题标题】:Technical code into the ViewModel in wpf?wpf 中的 ViewModel 中的技术代码?
【发布时间】:2011-03-27 11:23:49
【问题描述】:

我有一个 UserControl,其中一些自定义依赖项属性绑定到 ViewModel 中的 clr 属性。 ViewModel 具有应用程序逻辑,我在其中使用 FlowDocument 处理 TextPointer/TextRange 类。

我应该将这些内容放入 UserControl 的代码隐藏中还是 ViewModel 中?

ranges.Clear();
            TextRange range = new TextRange(boundXamlDocument.ContentStart, boundXamlDocument.ContentEnd);
            foreach (var block in boundXamlDocument.Blocks)
            {
                if (block is Paragraph)
                {
                    Paragraph p = block as Paragraph;
                    //if paragraph has Strikethrough, then do not loop its inlines.
                    if (p.TextDecorations.Contains(TextDecorations.Strikethrough[0]))
                    {
                        TextRange tr = new TextRange(p.ContentStart, p.ContentEnd);
                        ranges.Add(tr);
                    }
                    else
                    {
                        foreach (var run in p.Inlines)
                        {
                            if (run.TextDecorations.Contains(TextDecorations.Strikethrough[0]))
                            {
                                TextRange tr = new TextRange(run.ContentStart, run.ContentEnd);
                                ranges.Add(tr);
                            }
                        }
                    }
                }
            }

【问题讨论】:

    标签: wpf properties viewmodel dependencies code-behind


    【解决方案1】:

    只有当我的概念不能很好地融入任何常用控件(很少或永远不会),或者我有想要重用的自定义控件行为(更常见)时,我才会费心设计自定义/用户控件.

    您的控件越抽象,它的可重用性就越高。虽然,把它写得如此抽象以至于没有人会从中得到任何好处,那就太过分了:)

    如果您有应用程序逻辑,最好尽可能在视图模型(或模型)中定义它。当该逻辑发生变化时,它不会破坏您控制的其他用户。

    如果控件的某个功能不是特定于确切的演示/用户输入样式,而是特定于该控件的实例,您可能应该将它放在视图模型中。

    编辑:

    从您的 cmets 看来,您尝试编写的代码似乎取决于 UI 元素(TextBlock 文本装饰器)。这意味着它必须而且应该进入视图。

    【讨论】:

    • 从你的回答来看,似乎代码隐藏总是不行的......我已经用示例代码更新了我的初始化帖子,它的外观如何......我真的应该说到我的 ViewModel 中,我还声明了我的私有 IDocumentRepository _documentRepo = new DocumentRepository(); _documentRepo.DoStuff();将应用程序逻辑和存储库的东西放在一个类中看起来真的很奇怪,似乎表示层和数据访问边界正在模糊......
    • @Bluna:我不知道 总是 是错误的做法。后面的代码 == 查看。如果它是特定于视图的,则可以将其放在代码后面,只要它不是太多工作/太混乱而无法放入 XAML。
    • 啊,当我添加示例代码时,您的帖子是 4 秒前:P 我无法将此代码放入 xaml,因为它不起作用...
    • @Bluna:我喜欢将视图视为一次性代码。如果您想在任何给定时间点呈现另一种视图,您希望保留哪些代码?似乎你总是想要这个 if not strikethrough 代码,不管是什么视图,所以它应该放在视图模型中。
    • 带有示例代码我的意思是这不是我的代码只是一个示例... ;-) 我认为对 DepProp 实施的控制越差,MVVM 实施就越困难。所选文本上的 TextDecorations 只能通过 textblock.TextDecorations 检索,而且我认为我不会使用 textblock 之类的 UI 元素污染我的 ViewModel...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多