问题标签 [mvvm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
417 浏览

wpf - WPF绑定到不变的属性

我正在使用 MVVM 模式,并且我有一个带有 Start Date 属性的 POCO(在我的模型中)。

我想在 WPF 窗口/用户控件上的控件中显示自开始日期以来经过的时间...

我看不到如何将 ModelView 属性绑定到 UI 控件并让它自动更新此持续时间...有人可以建议一种方法吗?

我可以使用某些东西(计时器或线程)来更新我的 ModelView 上的持续时间属性,但我只是看不到任何其他方式,因为据我了解,UI 只会在属性值更改时更新。但是,我的 POCO 上的开始日期并没有改变,只是经过的时间在改变,这是一个计算值。

我错过了什么吗?

0 投票
5 回答
10747 浏览

.net - 仅使用 XAML 在左键单击时显示 ContextMenu

WPF 的默认行为ContextMenu是在用户右键单击时显示它。我希望在ContextMenu用户左键单击时显示。看起来这应该是 上的一个简单属性ContextMenu,但事实并非如此。

我操纵它,以便我LeftMouseButtonDown在代码隐藏中处理事件,然后显示上下文菜单。

我在我的项目中使用 MVVM,这意味着我将DataTemplates 用于具有上下文菜单的项目。摆脱代码隐藏并找到一种使用 XAML 中的触发器或属性来显示上下文菜单的方法会更加优雅。

对此问题有任何想法或解决方案吗?

0 投票
2 回答
2647 浏览

silverlight - 何时取消挂钩 Silverlight 中的事件

一句话总结:在 Silverlight2 的 UserControl 的构造函数中创建的 unhook 事件处理程序的最佳实践是什么?

背景: 我目前正在 Silverlight2 中构建一个业务线应用程序。由于 Silverlight 是一个浏览器插件,因此没有 Window 的概念 - 一切都在 UserControls 中完成。我在应用程序中处理不同“表单”的方式是拥有一个包含 Viewbox 的顶级用户控件。为了显示不同的表单,我将 Viewbox 的 Child 属性设置为不同的 UserControl。我的应用程序有一个单独的 PageManager 类,调用它来打开和关闭表单。表单 (UserControls) 存储在堆栈中。打开一个表单将它放在堆栈的顶部,关闭它会将它从堆栈中删除并显示它下面的一个。

我正在尝试遵循 Model-View-ViewModel 模式。在每个表单(从 UserControl 派生)中,我都有一个 ViewModel 来管理视图的所有数据。ViewModel 公开事件,以便在加载和保存等操作完成时通知 UI。

在我的表单中,在获得 ViewModel 之后,我订阅了构造函数中的事件

我的问题是:既然我已经订阅了这个事件,我什么时候删除处理程序?我是创建一个析构函数并在那里执行它,还是创建一个先有鸡还是先有蛋的情况,即垃圾收集器在所有引用(即:事件处理程序)都消失之前不会销毁对象?我是否创建了表单必须实现的接口,该接口指定了在 PageManager 关闭表单时调用的 UnhookEvents 函数?

编辑:感谢您的回复。ViewModel持续时间长于表单(UserControl)的情况呢?我的应用程序的一部分允许用户创建相当复杂的结构,但在 95% 的情况下它要简单得多。我所做的是创建 2 个使用相同 ViewModel 的表单。用户可以开始填写简单的表单,然后切换到高级模式,这将创建一个新表单,并将 ViewModel 传递给它。

在简单的设置表单中:

在高级设置表单中:

在 PageManager.Close 之后,唯一引用表单的是 ViewModel 中的事件。我想这就是我应该解开它们的地方。

0 投票
2 回答
591 浏览

multithreading - 如何在模型和视图之间共享数据?

我目前正在重新设计一个应用程序,该应用程序正在从输入数据构建模型,并将该数据显示给用户。当前系统具有用于构建模型的线程、用于构建模型的可视化的线程和显示可视化的线程。我遇到的问题是指针在建模和可视化线程之间传递——为了使线程安全,模型中的所有对象都必须有一个互斥体。这意味着系统中有数千个互斥锁处于活动状态,由于两个线程都在争夺资源,因此会出现很多停顿。

那么,鉴于这三个线程将存在,以高效和线程安全的方式在建模和可视化线程之间共享数据的最佳方式是什么?一些数据结构很大并且会改变建模线程的每个周期,所以我有点不愿意每次都复制数据。

编辑:

我们希望通过系统的总延迟是从接收消息到显示显示变化的显示大约 100 毫秒。如果可能的话,我们希望它更快,但更重要的是我们需要它保持一致 - 现在我们看到由于互斥体争用导致循环时间的巨大变化。从建模到可视化的数据以 2D 高度图为主——大约 18000 个单元格的数据。不过,模型更新中实际更新的单元数量要少得多——可能只有几百个。

0 投票
4 回答
633779 浏览

c# - 将 WPF ComboBox 绑定到自定义列表

我有一个似乎没有更新 SelectedItem/SelectedValue 的组合框。

ComboBox ItemsSource 绑定到 ViewModel 类上的一个属性,该类将一堆 RAS 电话簿条目列为 CollectionView。然后我已经(在不同的时间)绑定SelectedItem或绑定SelectedValue到 ViewModel 的另一个属性。我在 save 命令中添加了一个 MessageBox 来调试数据绑定设置的值,但是SelectedItem/SelectedValue绑定没有被设置。

ViewModel 类看起来像这样:

_phonebookEntries 集合正在从业务对象的构造函数中初始化。ComboBox XAML 看起来像这样:

我只对 ComboBox 中显示的实际字符串值感兴趣,而不是对象的任何其他属性,因为这是我在建立 VPN 连接时需要传递给 RAS 的值,因此DisplayMemberPath它们SelectedValuePath都是的 Name 属性连接视图模型。ComboBoxDataTemplate应用于ItemsControl其 DataContext 已设置为 ViewModel 实例的 Window 上。

ComboBox 正确显示项目列表,我可以在 UI 中毫无问题地选择一个。但是,当我从命令中显示消息框时,PhonebookEntry 属性仍然具有初始值,而不是 ComboBox 中的选定值。其他 TextBox 实例正在更新并显示在 MessageBox 中。

对 ComboBox 进行数据绑定时我缺少什么?我做了很多搜索,似乎找不到任何我做错的事情。


这是我看到的行为,但是在我的特定上下文中由于某种原因它不起作用。

我有一个 MainWindowViewModel,它有一个CollectionViewConnectionViewModels。在 MainWindowView.xaml 文件代码隐藏中,我将 DataContext 设置为 MainWindowViewModel。MainWindowView.xamlItemsControl绑定到 ConnectionViewModels 的集合。我有一个包含 ComboBox 以及其他一些 TextBoxes 的 DataTemplate。文本框直接绑定到 ConnectionViewModel 的属性,使用Text="{Binding Path=ConnectionName}".

XAML 代码隐藏:

然后是 XAML:

文本框都正确绑定,数据在它们和 ViewModel 之间移动没有问题。只有 ComboBox 不起作用。

您对 PhonebookEntry 类的假设是正确的。

我所做的假设是我的 DataTemplate 使用的 DataContext 是通过绑定层次结构自动设置的,因此我不必为ItemsControl. 这对我来说似乎有点愚蠢。


这是基于上面示例的演示问题的测试实现。

XAML:

代码隐藏:

如果您运行该示例,您将得到我正在谈论的行为。TextBox 在您编辑它时会更新其绑定,但 ComboBox 不会。看到我所做的唯一一件事就是引入一个父 ViewModel 非常令人困惑。

我目前的印象是绑定到 DataContext 的子项的项具有该子项作为其 DataContext。我找不到任何可以以一种或另一种方式解决此问题的文档。

IE,

Window -> DataContext = MainWindowViewModel
..Items -> 绑定到 DataContext.PhonebookEntries
....Item -> DataContext = PhonebookEntry(隐式关联)

我不知道这是否更好地解释了我的假设(?)。


为了确认我的假设,将 TextBox 的绑定更改为

这将显示 TextBox 绑定根(我将其与 DataContext 进行比较)是 ConnectionViewModel 实例。

0 投票
3 回答
1311 浏览

silverlight - 我应该如何在 Silverlight 中使用 MVVM 处理每个带有命令模式的控件的多个事件?

是否有人使用 SLExtensions 命令模式 ( http://www.codeplex.com/SLExtensions ) 将命令与 Silverlight 控制事件相关联?从我所见,您只能为每个控件附加一个事件的命令。例如,您只能为按钮添加单击事件、为文本框添加 keydown 事件等。

如果我想为每个控件添加多个事件怎么办?例如,如果我想为按钮的 Click 和 Drop 事件添加命令怎么办。开箱即用似乎没有办法使用 SLExtensions 代码处理此问题。

顺便说一句,这是在模型-视图-视图模型 (MVVM) 上下文中。

0 投票
1 回答
4384 浏览

model-view-controller - MVP 模式:多个 Presenter 应该解耦还是可以直接通信?

我有一个看起来像这样的用户界面:

我正在使用MVP 模式来驱动这个 ui。

我在这里简化了很多,但为了分而治之,我想将 Presenter 分成两部分:一个处理左侧视图中的用户手势(用户更改此视图中的模型列表,例如排序)另一个 Presenter 在右侧的 View 中处理用户手势(用户更改此 View 中的单个模型)。

虽然左侧的 Presenter 与整个模型列表交互,但右侧的 Presenter 仅与单个模型交互:用户从左侧列表中选择的模型。IOW ui 是从左到右驱动的。

在用户选择(即单击)左侧的模型后,我当前的实现(大致)如下所示:

这是我对 MVP 模式或任何 MVC GUI 模式的模糊部分:

  1. 一个 ui 可以像这样由多个 Presenter 驱动吗?
  2. 是否应该解耦多个 Presenter,或者他们可以直接相互通信,如此处所示?

所以我的问题归结为:表明用户在视图中选择模型的最佳方式是RightPresenterLeftPresenter什么?

0 投票
3 回答
17909 浏览

wpf - 带有 WebBrowser 的 WPF 中的模型视图 ViewModel

我使用 MVVM 模式在 WPF 中编写应用程序,其中我仅限于绑定到属性和命令 exclusivley

但是,我想使用 WebBrowser 控件,它只能将内容的 html 字符串作为 mthod 的参数,而不是属性。

我打算创建一个从 Webbrowser 派生的具有所需属性的新控件,但控件类是密封的。我尝试创建一个包装器控件,但是我遇到了各种依赖属性问题,这些问题似乎比我能解决的麻烦更多。

有什么方法可以将参数(字符串)推送到带有 MVVM 的方法中,而无需使用代码隐藏文件中的代码(这是一个很大的禁忌)。

谢谢

院长

0 投票
2 回答
15811 浏览

.net - 绑定到数据网格中的命令

我在 WPF 应用程序中使用 MV-VM 模式。我将 ViewModel 绑定到 ContentControl 并使用窗口资源中定义的数据模板来呈现该 ViewModel 的视图(UserControl)。

在 ViewModel 中,我有一个项目集合。我将该集合绑定到 WPF 工具包中提供的数据网格。同样在视图模型中,我定义了一个 RemoveItem 命令,该命令接受要删除的项目 ID 的参数。

我将如何绑定到数据网格中的该命令?网格的数据上下文就是那个集合,所以类似于:

不起作用 - 它找不到命令。我想我需要进行 RelativeSource 绑定,但那会是什么样子?祖先类型是 UserControl 还是 ContentControl?我的 ViewModel 作为 DataContext 驻留在哪里?

还是我离这儿很远?

0 投票
4 回答
4680 浏览

c# - 双淘汰赛的数据结构

我正在转换我的 Tournament Organizer 软件,该软件允许创建和操作双淘汰赛,以使用 MVVM 设计模式,以便可以更轻松地对其进行测试。在这样做的过程中,我将“模型”与直接操纵括号结构的 UI 中的一些代码分开。

这将是我为处理锦标赛而编写的第三次迭代软件。第一个是用 PHP 编写的,并将数据存储在数据库中。第二个版本是我做的WPF版本,它把数据存储在内存中,然后序列化成一个XML文件。然而,在这两个版本中,我觉得在实现的某些方面并不干净,并且似乎违反了 DRY 法则。

如果你从头开始创建一个数据结构来处理双重消除括号,你会怎么做?

请注意,它不需要能够通过算法自动生成括号(从预先制作的 4/8/16/32 人的双重淘汰加载是我现在的做法),只是主要用例设置比赛的获胜者并通过括号“推进”他们。

编辑:为了清楚起见,数据结构需要处理双淘汰赛,因此潜在地,一场比赛的获胜者可能最终与另一场比赛的失败者竞争。