Winforms MVP

2024-04-15

我主要有 ASP.Net 背景,懂一些 MVC。我也做了一些 Silverlight 和 MVVM,但是我现在即将转向 Winforms,我对它的经验很少,所以我想知道如何处理 MVP。

典型的 MVP 示例显示演示者设置视图属性(通过某种 IView 接口),例如具体视图将该属性值放入文本框中。可以在 MVP 中使用 INotifyPropertyChanged 来代替这种过时的方法吗?如果可以的话,如何使用?一个非常简单的例子将非常有用!

如果我要创建一个实现 INotifyPropertyChanged 的​​模型,那么这不是更像 MVVM 吗? (即演示者更新模型,并通过 INotifyPropertyChanged 的​​魔力更新视图)。然而,我在任何地方读到过有关 MVVM 和 Winforms 的内容,人们都说它不合适。为什么?我的理解是,您可以对任何控件的属性进行数据绑定,那么 Winforms 缺少什么?我试图了解与 WPF 相比 Winforms 中数据绑定的缺点,以及为什么不能使用 MVVM,因为它似乎比 MVP 更容易实现。

提前致谢 安迪.


我刚刚检查了 WinForms 中的数据绑定如何使用INotifyPropertyChanged。 数据绑定通过绑定源确实支持INotifyPropertyChanged if the 数据源的对象绑定源或对应的模型属性数据成员实现这个。您可以在这里充分利用 M. Fowlers 监督演示者/控制者: 您甚至不需要手写代码,绑定源将视图与模型属性在两个方向(模型 -> 视图和视图 -> 模型)同步,并且如果模型支持INotifyPropertyChanged然后视图将自动更新。 到目前为止我使用过的代码结构:

  1. 在视图初始化期间:

    this.bindingSource.DataSource = this.presenter;

  2. 设计者生成的代码:

    this.textBoxPhone.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bindingSource, "Model.Phone", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));

模型类:

public class Customer : INotifyPropertyChanged
{
    private string _firstName;
    public string FirstName
    {
        get { return _firstName; }
        set
        {
            if (_firstName == value)
                return;
            _firstName = value;
            NotifyPropertyChanged("FirstName");
        }
    }

    private string _lastName;
    public string LastName
    {
        get { return _lastName; }
        set
        {
            if (_lastName == value)
                return;
            _lastName = value;
            NotifyPropertyChanged("LastName");
        }
    }

    private string _company;
    public string Company
    {
        get { return _company; }
        set
        {
            if (_company == value)
                return;
            _company = value;
            NotifyPropertyChanged("Company");
        }
    }

    private string _phone;
    public string Phone
    {
        get { return _phone; }
        set
        {
            if (_phone == value)
                return;
            _phone = value;
            NotifyPropertyChanged("Phone");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

演讲者班级:

public class CustomerPresenter
{
    public CustomerPresenter(Customer model)
    {
        if (model == null)
            throw new ArgumentNullException("model");

        this.Model = model;
    }

    public Customer Model { get; set; }

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

Winforms MVP 的相关文章

  • 创建图像列表框?

    如何在 Winforms 应用程序上创建一个 ListBox 控件 该控件以有序的方式包含图像 就像它包含文本一样 I d like the images to appear like this 也许我什至不需要使用列表框 也许有更好的控制
  • 绑定到 Silverlight 4 中的 DependencyObject 集合

    从 Silverlight 4 开始 可以针对 DependencyObject 而不是以前版本中的 Framework 元素 进行数据绑定 到目前为止一切顺利 但如何再次绑定 DependencyObjects 集合 DataContex
  • 使用虚拟列表视图调用 BeginUpdate/EndUpdate 是否有用

    我有一个虚拟列表视图 其中有数百个项目 我必须定期更新文件列表视图 方法是清除它 然后向其中添加新的 更新的项目 执行此操作时调用 BeingUpdate 和 EndUpdate 有用吗 我没有注意到任何视觉差异 Thanks 使用可能有一
  • DataGridViewCheckBoxCell 类型的 DataGridView 列始终处于只读/禁用状态

    我正在使用 NET Windows 窗体 DataGridView 并且需要编辑 DataBound 列 绑定到布尔 DataTable 列 为此 我指定单元格模板 如下所示 DataGridViewColumn 列 new DataGri
  • C# Windows 应用程序中的文件上传

    在我的 C Windows 应用程序中 我想上传 pdf 文件 但在我的工具箱中找不到 FileUpload 控件 我如何在 C Windows 应用程序中上传 pdf 文件 regards 将 OpenFileDialog 控件放在窗体上
  • 如何在不实际调整大小的情况下触发 Control.Resize 事件?

    我不会对控件进行子类化 尝试通过触发事件Control Size Control Size失败 因为即使新大小实际上不同 它也不会触发 如果您要子类化Control 你可以打电话OnResize直接 或者将其暴露在 API 上 public
  • 找出最后获得焦点的控件

    我有一个带有几个文本框和一个按钮的 C Windows 窗体应用程序 我想找出具有焦点的文本框并用它做一些事情 我已经编写了以下代码 但它当然不起作用 因为按钮一旦按下就会获得焦点 private void button1 MouseDow
  • 是否可以在 .Net Windows 表单内托管 Microsoft Access 表单?

    我问是否可以在 Net 表单中托管 Microsoft Access 表单 不 我没有发疯 我们正在维护一个完全用 VBA 编写的庞大系统 由一个不太了解 VBA 的人尝试使用 Microsoft Access 作为 IDE 它基本上是数千
  • 在 WinForms 中显示输入对话框

    我想在我的 WinForm 应用程序中显示输入模式 我浏览过网络 但没有找到执行此操作的良好模式 我知道我必须创建另一个表单 并使用 ShowDialog 方法 你是对的 请注意 模式对话框在关闭时不会自动处理 与非模式对话框不同 因此您需
  • 将静态类的字符串变量数据绑定到 Phone 7 中的 textBlock?

    这是 C 代码 public static class Global public static string Temp get return temp set temp value public static string temp 10
  • 如何在 C# 中从 TabPage 获取控件?

    我有几个选项卡页 每个选项卡页都包含富文本框 如何在选定的选项卡上访问 richtechbox TabPage selectedTab tabControl SelectedTab RichTextBox selectedRtb selec
  • 双击选项卡控制标题

    一段时间以来我一直想知道这个问题 双击 winforms TabControl 的标题没有被检测到 但我想处理这个事件 看起来所有鼠标事件 单击 移动等 在 TabControl 的 非活动 区域上时都不会引发 我什至尝试过对 TabCon
  • 如何禁止在应用程序启动时创建空日志文件?

    我已经在我的应用程序中成功配置了 log4net 但有一件事对我来说有点烦人 即使没有发生错误 日志文件也会在我的应用程序启动后创建 空 我想仅在出现错误后才创建日志文件 我实际上在这个线程中找到了一种方法来做到这一点 http www l
  • 只允许在 datagridview 单元格中键入一些字符

    有没有办法只将某些字符添加到 datagridview 单元格中 像 1234567890 据我所知 您可以使用两种方法来实现此目的 第一个 我认为最好的 是使用 CellValidating 事件DataGridView并检查输入的文本是
  • 如何在代码中访问 DataGridCell 的数据对象?

    基本上 我已经绑定了数据网格 使其类似于科目时间表 每行代表一个学期的科目 该学期内的每个单元格代表一个科目 我现在尝试添加拖放功能 以便您可以将其他主题拖到网格上 这将更新底层数据结构 我可以使用一些可视化树方法来查找用户将新主题拖动到的
  • 如何在C#中模拟鼠标点击?

    如何在 C winforms 应用程序中模拟鼠标点击 我结合了多个来源来生成我当前正在使用的下面的代码 我还删除了 Windows Forms 引用 以便我可以从控制台和 WPF 应用程序使用它 而无需其他引用 using System u
  • Winforms Chart - 在折线图上绘制允许的区域

    如何在图表上绘制灰色区域 信号的允许范围 我使用 Winforms 和标准 MicrosoftSystem Windows Forms DataVisualization类 它应该是自定义范围 这意味着起始 Y 点不能仅为零 我在运行时在线
  • ASP.NET 代码表达式、数据绑定和其他声明式表达式

    这些标签有什么区别 更重要的是 如何在 ASP NET 控件中使用声明性语法显示页面属性 我正在尝试在 ASP NET 控件中执行此操作 任务是设置标签的文本 但如果我想更改输出控制 我不想以语法方式执行此操作 我收到有关服务器端控件不能包
  • 在 Winforms 中,PreviewKeyDown() 从未针对任何键触发

    我最初试图让我的程序获取箭头键 上 下 左 右 的输入 但发现在 KeyDown 中这些键从未出现过 后来我发现我可以通过进入 PreviewKeyDown 函数并设置来启用箭头键 e IsInputKey true 及其周围的任何条件和逻
  • 如何验证文本文件中的用户名和密码? | Winforms C#

    首先我制作了textbox1 用于用户名 textbox2 用于密码 和button1 检查 后 private void button1 Click object sender EventArgs e FileStream fs new

随机推荐

  • Airflow initdb slot_pool 不存在

    我面临一个问题airflowpostgres 后端初始化 乌班图 18 04 1 气流 v1 10 6 Postgres 10 10 Python 3 6 当我跑步时 airflow initdb I get 2019 11 22 10 1
  • 在本例中如何避免 VBA 中的 select/active 语句?

    需要导出一个PDF文件中的所有工作表 所以我找到了这段代码 它有效 导出一个PDF 每张工作表一个页面 但我不想使用 select active 语句 我更喜欢使用存储对象的变量 问题 如何避免此代码中的 select ActiveShee
  • WPF MVVM 可观察集合不更新 GUI

    我正在设计一个 MVVM WPF 应用程序 并且有一个 ViewModel 它有一个名为 SelectedCustomer 的属性 类型为 Customer 该对象有一个名为 SummaryDetails 的 ObservableColle
  • 如何在 GWT 的 Jetty 中启用 HTTPS?

    如何在 GWT 附带的 Jetty 中启用 HTTPS gwt dev jar 中 隐藏 了一个 README SSL txt 你可以找到最新版本在 Github 上 https github com gwtproject gwt blob
  • (Fortify) 类别:Android 不良做法:缺少 Google Play 服务更新的安全提供程序(1 期)

    我们正在使用 Fortify 扫描我的 Android 源代码 但我无法摆脱这个问题 类别 Android 不良做法 缺少 Google Play 服务更新的安全提供程序 1 期 Fortify指向这行代码 工具 替换 android al
  • Numpy 沿特定维度选择不替换

    在不进行替换的情况下 我根据指定的分布从样本中 n 次不同地选择 k 个元素 迭代解决方案很简单 for in range n np random choice a size k replace False p p 我无法设置size k
  • Java:如何通过忽略“\n”来逐行读取文件

    我正在尝试读取每行制表符分隔的文本文件行 行通过使用回车符 r n 进行分隔 并且在制表符分隔的文本字段中允许使用换行符 n 由于我想每行读取文件行 因此我希望我的程序忽略独立的 n 很遗憾 BufferedReader使用这两种可能性来分
  • std::this_thread::yield 与 Linux 上的 sched_yield 有什么不同吗?

    我只是想知道如何std this thread yield是在linux上实现的 它与sched yield 我见过一些自旋锁的实现 这意味着std this thread yield是更轻量级的东西sched yield就线程放弃进程多长
  • OSGi 应用程序修补策略

    修补 OSGi 容器的适当机制是什么 1 Should the bundles binaries jars have the same name as the old ones then a Replace the bundle with
  • 使用多线程的 JPA 中的事务

    我的目标是使用单元测试在我的应用程序中引发乐观锁定异常 我已经在理论上了解了如何做到这一点 但我在实践中的问题是如何维护两个线程之间的事务 所以 这就是我到目前为止所做的 我正在使用 JUnit 测试 RunWith SpringJUnit
  • 用于进行修改的 git 工作流程,您永远不会将其推回原点

    我正在构建一个 iPhone 应用程序PhoneGap http phonegap com 其中有一个 Git 存储库 我想在我自己的 Git 存储库中跟踪对 PhoneGap 代码的更改 主要是向 www 目录添加文件 同时能够从 Pho
  • GitHub、Gerrit、Hudson(Jenkins) 工作流程

    我刚刚开始一起使用 GitHub Gerrit 和 Hudson Jenkins 我需要一些关于工作流程的想法 我们想使用 GitHub 作为我们的主要远程存储库 我们希望主要使用 Gerrit 进行代码审查 但也用于 Hudson 中的构
  • 如何运行 Webpack 开发服务器 --https --hot --inline

    使用 CLI 配置时 有没有办法在 https 上运行 webpack dev server 问题是连接到socket io结束了http并不是https 存在解决方法 但非常烦人 手动包含https webpack dev server在
  • Scala - 以函数方式修改字符串

    我刚刚开始使用 Scala 因此开始以更实用的方式做事 只是想知道是否有一种更实用的方法来实现如下所示的功能 def expand exp String String var result exp for k v lt libMap res
  • Python/Django 中的音频波形可视化

    我已经在 Stack Overflow 上寻找这个问题的答案 但似乎没有地方给出正确的答案或方向 我的项目将允许用户上传 WAV 最终将在服务器上使用 FFmpeg 将其转换为低质量 MP3 并将全部存储在 Amazon S3 上并提供服务
  • asp.net mvc - ActionLink 的渲染不一致

    我有一个控制器 它接受以下两种格式的 URL 网络 添加或编辑 gt 在页面上呈现空白表单以添加新的网络对象 网络 AddOrEdit id gt 使用预填充表单呈现页面以编辑网络对象 带有 ID id 显然 每个实例中都使用相同的视图 我
  • 在 JavaScript 中逐行动态添加字幕到视频元素

    我想知道目前是否可行 下面是我的 HTML
  • Chrome DevTools 中缺少“添加到主屏幕”链接

    使用 Google 服务可能会令人沮丧 他们有令人难以置信的文档 但文档总是假设一切正常 如果有什么东西不像广告上说的那样有效 那你就完全靠自己了 没有错误消息 没有解决问题的帮助 甚至没有承认某些事情可能不起作用 以防万一 添加到主屏幕
  • 如何检索 C99 可变参数宏的最后一个参数?

    Visual Studio 失败的 static assert 错误消息完全由错误代码和 static assert 的第二个参数组成 没有任何其他消息表明这是静态断言失败 我想做一个宏来解决这个问题 例如 作为第一次尝试 define S
  • Winforms MVP

    我主要有 ASP Net 背景 懂一些 MVC 我也做了一些 Silverlight 和 MVVM 但是我现在即将转向 Winforms 我对它的经验很少 所以我想知道如何处理 MVP 典型的 MVP 示例显示演示者设置视图属性 通过某种