当前位置: 首页 > 编程笔记 >

wpf 视图模型

郎同化
2023-03-14
本文向大家介绍wpf 视图模型,包括了wpf 视图模型的使用技巧和注意事项,需要的朋友参考一下

示例

视图模型是MV VM中的“ VM” 。这是一个充当中介的类,将暴露model(s)给用户界面(视图),并处理来自视图的请求,例如单击按钮引发的命令。这是一个基本的视图模型:

public class CustomerEditViewModel
{
    /// <summary>
    ///客户来编辑。
    /// </summary>
    public Customer CustomerToEdit { get; set; }

    /// <summary>
    /// The "apply changes" command
    /// </summary>
    public ICommand ApplyChangesCommand { get; private set; }

    /// <summary>
    ///构造函数
    /// </summary>
    public CustomerEditViewModel()
    {
        CustomerToEdit = new Customer
                         {
                             Forename = "John",
                             Surname = "Smith"
                         };

        ApplyChangesCommand = new RelayCommand(
            o => ExecuteApplyChangesCommand(), 
            o => CustomerToEdit.IsValid);
    }

    /// <summary>
    /// Executes the "apply changes" command.
    /// </summary>
    private void ExecuteApplyChangesCommand()
    {
        // 例如,将您的客户保存到数据库
    }
}

构造函数创建一个Customer模型对象,并将其分配给CustomerToEdit属性,以使视图可见。

构造函数还创建一个RelayCommand对象并将其分配给ApplyChangesCommand属性,再次使该对象对视图可见。WPF命令用于处理视图中的请求,例如按钮或菜单项的单击。

它RelayCommand有两个参数-第一个是在执行命令时调用的委托(例如,响应于单击按钮)。第二个参数是一个委托,它返回一个布尔值,该布尔值指示命令是否可以执行;在此示例中,它已连接到客户对象的IsValid属性。当此返回false时,它将禁用绑定到此命令的按钮或菜单项(其他控件的行为可能有所不同)。这是一个简单但有效的功能,无需根据不同的条件编写代码来启用或禁用控件。

如果确实启动并运行了此示例,请尝试清空TextBoxes之一(以将Customer模型置于无效状态)。当您离开时,TextBox应该会发现“应用”按钮被禁用。

谈客户创造

视图模型未实现INotifyPropertyChanged(INPC)。这意味着,如果将不同的Customer对象分配给CustomerToEdit属性,则视图的控件将不会更改以反映新对象TextBox-es仍将包含先前客户的姓氏和姓氏。

示例代码之所以有效,Customer是因为在视图模型的构造函数中创建了,然后再将其分配给视图的模型DataContext(此时绑定了绑定)。在实际的应用程序中,您可能会使用构造函数以外的方法从数据库中检索客户。为此,VM应该实现INPC,并且CustomerToEdit应该更改属性以使用示例模型代码中看到的“扩展” getter和setter模式,从而PropertyChanged在setter中引发事件。

视图模型ApplyChangesCommand不需要实现INPC,因为命令不太可能更改。你需要,如果你创建了比其他构造的命令的地方,例如某种实现这种模式Initialize()的方法。

一般规则是:如果属性绑定到任何视图控件,并且该属性的值能够在构造函数中以外的任何地方更改,则实现INPC 。如果仅在构造函数中分配了属性值,则无需实现INPC(并且您将在过程中节省一些键入操作)。

 类似资料:
  • 本文向大家介绍wpf 模型,包括了wpf 模型的使用技巧和注意事项,需要的朋友参考一下 示例 该模型是M VVM中的第一个“ M” 。该模型通常是一个类,其中包含您要通过某种用户界面公开的数据。 这是一个非常简单的模型类,它具有几个属性: 此类实现INotifyPropertyChanged暴露PropertyChanged事件的接口。只要其中一个属性值发生更改,就应引发此事件-您可以在上面的代码

  • 我使用的是WPF ListView,其中SelectionMode设置为Extended(只能按ctrl键选择多个项目)。我需要实施D 不幸的是,这样的解决方案有一个错误:选择单个项目(未按 ctrl)有效。但是,我需要双击以选择项目,同时按ctrl才能选择多个项目。使用 ListView 的 PreviewMouseDown 或 ListViewItem 的 PreviewMouseDown 时

  • 我在我的应用程序中使用MVVM模式。我有以下(简化版)VM类: 因此,一个Module2601_VM包含几个属性,以及Module2610_VM和ComPort_VM对象的列表。 我有一个MainModule_VM类中Module2601_VM对象的列表。 我想将这个Module2601集合及其子项绑定到树状视图中,并使用以下层次结构: 网关: 网关#0 COM#1 我的问题是,我的层次结构正常,

  • 我是 WPF 的新手,我想使用卡利本微遵循 MVVM 框架。我卡住了从另一个视图模型中更新列表的问题。 我有3个观点: POSView:包含另外2个视图的两个内容控件 ProductView:所有产品的列表 CartView:购物车中添加的所有产品列表 单击“产品视图”中的“产品”时,产品应添加到购物车视图中 POSViewModel.cs 产品视图模型。cs:在AddProdClick(Prod

  • 模板引擎适合于动态 HTML 页面输出或者代码生成,在Web开发中是常见的 装备。 Blade内置了简单的模板引擎,为了应付网页渲染和简单的数据传输。在日常开发中, 我们通常使用一些优秀的、高效的、功能较为完善的模板引擎,诸如 Velocity、Freemarker、JetbrickTemplate 等等。 Blade支持扩展任意一款模板引擎,同时也有多个实现了,在 这里,也欢迎你贡献代码。 默认

  • CabalPHP的模板引擎是 league/plates,相关语法请参考 plates 的文档。 获取模板引擎 要使用 plates 请先修改 usr/boot.php,取消 Boot 类中的 use Cabal\Core\Http\Server\HasPlates 注释: class Boot extends Cabal\Core\Application\Boot { //...