WPF设计问题(自定义控件或mvvm)

2024-02-06

这是场景:

  • 我有一个显示一些数据的视觉效果
  • The data to the visual can come in one of two ways
    1. 通过用户通过键盘或鼠标输入
    2. 通过一些后端源
  • Both these data inputs can be of one of two forms
    1. 控制数据或
    2. 简单显示的原始数据
  • 控制数据导致视觉变化
  • 原始数据简单地按原样显示

换句话说,视图由两个主设备提供服务,即用户输入和后端输入。 一个例子是由用户输入控制视觉效果的多用户游戏 但也可能具有由某些后端输入(例如 TCP/IP)控制的相同视觉效果。 另一个例子是终端模拟器,它获取用户输入,但也获取数据 来自其他来源,无论是远程登录还是串行等。

我正在考虑为视觉效果编写一个 WPF 自定义控件。换句话说, 它是一个黑盒子,可以解释输入并显示结果。 让用户输入到这个自定义控件中很容易,因为人们可以监听 适当的事件并根据需要进行处理。然而,如何才能听到 后台输入?公开绑定到的依赖属性不会导致 有道理,但在视觉上公开用数据调用的方法也不会 感觉。

另一种选择是 MVVM 架构,其中 Model 是后端数据源 视图模型完成所有工作。它获取后端数据(通过模型) 和用户输入(通过适当的命令绑定或类似的命令),它使得 适当地感知这些并绑定到视图以显示这些更改。

自定义控件的优点是它可以作为一个控件来使用 自我照顾,因此消费者只需做很少的工作即可使用它 但问题是从后端获取数据。 MVVM方法的优点在于它巧妙地封装了处理逻辑、视图等。问题是 必须对每个后端重复此模式。因此,视觉效果非常简单 并将所有处理逻辑暴露在控件之外。基本上我想要 使其非常容易食用,以便有人可以拿走并使用它而无需添加 太多的外部逻辑来进行处理等。他们提供的只是后端数据 融入视觉的来源。

抱歉这篇文章很长,但我正在学习 WPF,这是一个有趣的设计 向我提问。欢迎所有想法、评论等。

谢谢阅读。


我肯定会使用 MVVM 模式。您可以在代码中实现非常好的关注点分离,并且您的视图模型也可以在用户界面之外进行测试。您还可以在 Blend 中编辑视图。我不认为将视图模型连接到后端比连接自定义控件更复杂。您可能决定使用依赖项注入或服务定位器来连接事物。通过使用所有这些设计模式,您可以获得更加解耦和可测试的解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF设计问题(自定义控件或mvvm) 的相关文章

  • 三层 Asp.Net 应用程序中的异常处理

    1 据我了解 在three tierAsp Net应用程序我们应该通过以下方式实现异常处理 a 我们应该把try catch围绕代码块 位于三层中的任何一层 我们希望页面能够从该代码块正常恢复 当此代码生成异常时 b 我们不应该放try c
  • 强制函数调用的顺序?

    假设我有一个抽象基类 并且我想要一个必须由派生类实现的纯虚方法 但我想确保派生方法以特定顺序调用函数 我可以做什么来强制执行它 I E base class virtual void doABC 0 virtual void A 0 vir
  • ListViewItem 与 CheckBox IsChecked 绑定到 ViewModel

    我有一个带有 DataTemplate 的 ListView 用于为每个 ListViewItem 显示一个复选框
  • 我对 MVVM 模式有一些疑问

    我叫 Jes s 来自西班牙 是一名 NET 开发人员 几天前我刚刚发现了这个伟大的网络 我有一些关于 MVVM 模式的问题 如果您能回答我 我将很高兴 我三个月前开始使用 WPF 并且学习了 MVP 模式 MVP 非常好 因为您可以很好地
  • 为什么我的 WPF XAML Grid TranslateTransform.X 不会?

    我可以使用它来更改网格的宽度 高度 那么为什么当我这样使用 Grid RenderTransform TranslateTransform X 时它不起作用
  • C 中的 N 依赖注入 - 比链接器定义的数组更好的方法?

    Given a 库模块 在下文中称为Runner 它作为可重复使用的组件 无需重新编译 即静态链接库 中应用程序分区架构的 而不是主分区 请注意 它仅包含main 出于演示目的 Given a set 顺序无关 调用的其他模块 对象Call
  • 在代码中而不是 XAML 中呈现 UserControl

    我想用RenderTargetBitmap将 UserControl 呈现为位图 而无需为其编写 XAML 当我这样做时 我得到一张空白图像 我是否错过了关键的一步 ValTool Controls VideoFisheyeOverlayC
  • 如何向 ItemsControl 中的 WPF 按钮添加相同的命令

    如何将命令添加到 wpf 按钮 该按钮是ItemsControl并正在修改ItemsSource itself 这是我的 XAML
  • 如何简化 ASP.NET MVC 中的全状态交错模式对话框

    我需要在多对多模式对话框中保留状态渐进增强 http en wikipedia org wiki Progressive enhancementASP NET MVC 项目中的方式 在我的代码中 当禁用 javascript 时 模式对话框
  • 自定义DataGridView列值在失去焦点后消失

    我在 WinForms 中为我的项目创建了一个自定义 DataGridViewColumn 该控件呈现完美 但一旦我输入值并移动到另一个单元格 当我签入 CellEndEdit 时 该值就会消失并显示为 null 以下是代码 class N
  • 值转换器是否在 WPF 中按绑定实例化?

    是否为使用特定值转换器类的每个绑定实例化一个单独的 WPF 值转换器对象 我正在尝试创建一个双向位到布尔值转换器 我希望能够绑定一个bool财产 如IsChecked 到值类型中的一个位 例如ushort 我正在使用转换器parameter
  • 将 System.Drawing.Image 转换为 System.Windows.Media.ImageSource 但没有结果

    我想在我的 WPF 应用程序中将 Image 转换为 ImageSource 我使用正常工作的 Code128 库 已在 WinForms 应用程序中检查 下面的函数返回具有适当大小的 ImageSource 但没有任何内容可见 priva
  • 如何使用 Caliburn.Micro MVVM 将焦点设置到控件

    我有一个表单 我想在发生某些用户操作时将焦点设置到文本框 我知道 MVVM 的处理方式是绑定到 VM 属性 但是 TextBox 没有允许这种情况发生的属性 从虚拟机设置焦点的最佳方法是什么 我创建了一个 IResult 实现 可以很好地实
  • 专家 C#/.Net/WPF 开发人员应该了解哪些知识? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 WPF 中从原始帧渲染视频?

    我有一个特殊的摄像机 使用 GigEVision 协议 我使用提供的库进行控制 我可以订阅帧接收事件 然后通过 IntPtr 访问帧数据 在我的旧 WinForms 应用程序中 我可以通过从数据创建 Bitmap 对象并将其设置为 Pict
  • 我如何移动粘性/捕捉 wpf 窗口

    当我移动 主 窗口时 我想移动两个或更多粘性窗口 我想做这样的事情 private void MainWindow PreviewMouseMove object sender MouseEventArgs e if e LeftButto
  • WPF TextBox:如何将默认绑定模式更改为 OneWay?

    最初 我有以下代码
  • 如何创建自动滚动文本框

    我有一个 WPF 应用程序 其中包含一个多行文本框 用于显示调试文本输出 如何设置文本框 以便将文本附加到框中时 它会自动滚动到文本框的底部 我正在使用 MVVM 模式 理想情况下 纯 XAML 方法会很好 TextBox 本身不一定是焦点
  • wpf 的 prism 与 mvvm light

    我们正在启动一个带有 MVVM 的 WPF 项目 并且必须决定使用 PRISM 还是 MVVM Light 我对这两个框架都是新手 我已经阅读了一些帖子 但仍然有一些问题 有人可以阐明以下几个方面吗 两个框架 性能 无论出于何种原因 其中一
  • iostream 对象 cin、cout、cerr 和 clog 是如何实现的?

    iostream 对象 cin cout cerr 和 clog 是在 iostream 标头中声明的对象 我知道在某些编译器中可能会在构造这些 iostream 对象之前尝试使用它们 因此在某些情况下它们必须受到 静态初始化顺序失败 的影

随机推荐

  • AWS S3 内联显示文件而不是强制下载

    由于某些原因 我的 S3 存储桶中的文件被强制下载 而不是内嵌显示 因此 如果我复制图像链接并将其粘贴到地址栏中 然后导航到它 它将促使我的浏览器下载它 相反 我实际上必须单击 打开图像 才能转到该网址 任何更改 S3 提供文件的方式的方法
  • 每次页面查看的成本哪个更高 - 数据库写入或文件写入?

    当您需要在应用程序中的每个页面视图上记录一些数据时 最有效的解决方案是什么 应该写入文件还是写入数据库 或者也许两者都不是 也许您应该将数据缓存在内存或文件中 并且只偶尔将其写入数据库 或文件系统 如果您使用内存缓存 如果只是记录少量数据而
  • 是否可以为组合类设置CSS?

    假设我有以下内容 tr background fff tr even background eee tr highlight background fec 是否可以指定第四个背景 fea 而不是有highlight只需覆盖even tr c
  • netBeans 图形用户界面问题

    我在 netBeans 中设计了这个 gui 它有一个 canvas 几个 JtextAreas 和一个 Jbutton 它在预览中看起来很棒 问题是当我运行实际程序时 文本区域会缩小 直到程序在其中打印一些内容 然后它们扩展到完整尺寸 J
  • jQuery 中两个按钮的功能相同

    我有两个按钮 btnAdd and btnUpdate 我为按钮编写了一个 jquery 函数btnUpdate验证网页中的某些字段 例如 function click function code here 我想做同样的事情btnAdd被点
  • kbuild 实际上是如何工作的?

    当我开发 Linux 驱动程序时 我读过如何通过此编写 linux kbuild makefiledocument https www kernel org doc Documentation kbuild makefiles txt 我知
  • HTTPS 和外部 (CDN) 托管文件?

    我有一个页面引用了几个外部托管的 javascript 文件 即 谷歌上的 jQuery http code google com apis libraries devguide html and YUI 使用 YUI 加载器 http d
  • 已编译的查询和“参数不能是序列”

    我认为编译的查询将执行与 DataContext 相同的查询转换 然而 当我尝试使用带有 Contains 方法调用的查询时 出现运行时错误 我哪里出错了 private member which holds a compiled quer
  • 发送大量UDP数据包时如何减少系统调用开销? (Windows 和 Linux)

    例如 我在 Windows 上发送 100000 个 UDP 数据包 对于每个数据包 我需要调用WSASendTo 一次 所以可能会引入很多系统调用开销 有没有办法进行批量发送并减少这种开销 我在谷歌搜索了一段时间后找不到适用于 Windo
  • 如何在android中像没有微调器的微调器一样弹出列表?

    我的活动中有一个微调器小部件 可让用户选择列表名称 通常 微调器的功能是在列表之间切换 但对于几个实例 我交换了选择更改侦听器以使用相同的选项列表执行不同的功能 一旦做出选择 老听众就会恢复 生活继续 这是一个糟糕且有问题的安排 相反 我想
  • 使用 connect by 子句递归插入

    我在表中有分层数据 右 按照以下方式创建层次结构 如左所示 表保存在 oracle 11g 中 TREE Hierarchy Tree Table Element Parent P0 P0 P1 P1 P0 P11 P2 P0 C111 P
  • 在 C 中执行简单 MPI 程序时集群挂起/显示错误

    我正在尝试运行一个简单的 MPI 程序 多个数组加法 它在我的 PC 中完美运行 但只是挂起或在集群中显示以下错误 我正在使用 open mpi 和以下命令来执行 集群网络配置 主节点1 MASTER eth0 Link encap Eth
  • 如何在 VB.net 中让函数运行回调

    恐怕我一直在谷歌搜索这个 但找不到我理解或可以使用的答案 在 Javascript 中 您可以运行一个函数并设置一个回调函数 该函数在第一个函数运行后调用 function doThis callBack do things do thin
  • gulp 和 karma,文件 karma.conf.js 不存在

    我有一个基本的 AngularJS 应用程序 希望让我的所有终端命令都通过 gulp 任务运行 例如 gulp dev对于开发服务器和 gulp unitTest用于测试等 我已经按照文档安装了 Gulp npm install save
  • 将驱动器号转换为分区 ID/磁盘 ID

    给定驱动器盘符 我如何获得OSImage安装到分区ID http technet microsoft com en us library ff716430 aspx and Disk ID http technet microsoft co
  • BCC 发送 PHP mail() 到邮件列表的方式与 TO 不同吗?

    我正在改进 PHP 邮件列表代码 使用mail 在循环中迭代所有订阅者 该脚本用于显示 超出最大执行时间 30 秒 错误 我通过添加解决了该错误set time limit 0 现在没有错误 但发送 100 条消息花了大约七分钟 我有什么选
  • 如何了解System.Windows.Forms.dll中System.InvalidOperationException的详细信息?

    运行我的应用程序时 我在 Visual Studio 的 输出 面板中发现了下面的异常日志 System Windows Forms dll 中发生 System InvalidOperationException 类型的第一次机会异常 该
  • 动态像素化 html 图像元素

    我要在网页上拍摄图像 然后使用 javascript 或最适合的任何内容 对其进行动态 像素化 例如 变成 20px 的正方形 然后 当用户向下滚动页面时 我需要图像的分辨率逐渐增加 直到它不再像素化 我有什么想法可以去做这件事吗 我意识到
  • PayPal Express Checkout 集成响应

    我目前很难理解我的 PayPal EC 集成的响应 GetExpressCheckoutDetails 响应是 CHECKOUTSTATUS gt PaymentActionNotInitiated 但在 DoExpressCheckout
  • WPF设计问题(自定义控件或mvvm)

    这是场景 我有一个显示一些数据的视觉效果 The data to the visual can come in one of two ways 通过用户通过键盘或鼠标输入 通过一些后端源 Both these data inputs can