我刚刚开始研究MV-VM的WPF应用程序.到目前为止,除了这个特殊问题,一切都有意义......
我有一个ViewModel我会称之为搜索.此ViewModel绑定到数据网格并列出项目的结果.现在,我有一个命令,需要调出另一个视图,项目的详细信息.
将逻辑显示在搜索视图中显示另一个视图似乎不对,它根本不可测试.
这是我的ViewModel实现,它是不可测试的......
public class SearchViewModel
{
public void SelectItem()
{
// I want to call the DetailsView from here
// this seems wrong, and is untestable
var detailsView = new DetailsView();
detailsView.Show();
}
}
Run Code Online (Sandbox Code Playgroud)
从ViewModel方法显示视图的逻辑在哪里进入这种模式?
我一直在使用我的MV-VM开发一个非常大的LOB应用程序,我称之为MV-MC(Model-View-ModelController),它是MVC和MV-VM之间的一种组合.我已经发布了这个答案,关于如何在MV-VM中实例化视图,问题是" 什么是最常见的错误 - 在wpf开发中制造 ".
Sam就我的回答发表了以下评论:
这会产生一个后续问题:如何创建视图?我使用RelayCommands将视图中的操作绑定到ViewModel,因此视图甚至不知道某个操作已被触发,也不知道他应该打开一个新视图.解决方案:在VM中创建一个事件以供View订阅?
当我最初开始MV-VM开发时,我认为一切都应该存在于ViewModel中,并且已经研究了很多像Josh Smith和Karl Shifflett这样的人的例子.但是,我还没有提出一个很好的例子,说明命令何时需要存在于ViewModel中.
例如,假设我有一个显示客户的ListView,以及我点击的按钮,允许我编辑当前选定的客户.ListView(View)绑定到CustomerVM(ViewModel).单击该按钮将触发EditCustomerCommand,这将打开一个弹出窗口,允许我编辑CustomerVM的所有属性.这个EditCustomerCommand在哪里?如果它涉及打开一个窗口(UI功能),它不应该在视图的代码隐藏中定义吗?

有没有人有任何关于何时应该在View和ViewModel中定义命令的例子?
Matthew Wright在下面说:
从列表中删除和删除将是很好的例子.在这些情况下,会添加空白记录或ViewModel删除当前记录.视图采取的任何操作都应该响应发生的事件.
所以,如果我点击新按钮,会发生什么?Customer ViewModel创建了一个CustomerVM的新实例并添加到它的集合中吗?那么我的编辑屏幕怎么会打开呢?该视图应该创建Customer ViewModel的新实例,并将其传递给ParentVM.Add(newlyCreatedVM)方法吗?
假设我通过VM上的DeleteCommand删除客户记录.VM调用业务层并尝试删除记录.它不能这样它会向VM返回一条消息.我想在对话框中显示此消息.视图如何从命令操作中获取消息?
我正在WPF中实现MVP/MV-VM,到目前为止我还好运.但是,我没有看到此模型如何支持实现模态对话框.我从Crack.NET(http://www.codeplex.com/cracknetproject)中获取了我的工作,以了解这些东西是如何工作的.
我有一个ShellView视图(它只是XAML),上面有一个菜单.该菜单绑定到ShellModelView中显示"EditPreferences"的命令.
ShellModelView实现了EditPreferences的ICommand,在这里我们想要设置一个对话框,让用户编辑应用程序的首选项.
这里有几个问题:1.ShellModelView没有对ShellView的引用来正确地为对话框提供父级.ShellModelView是ShellView的DataContext,但我没有看到设置的反向引用.2.无论如何,ShellModelView不应该加载显式UI.那么这里适当的交互模型是什么?3.如何构建我的PreferencesDialog,以便在逻辑和视图之间正确分隔?PreferencesDialog本身需要是一个Window,因此您可以在其上调用ShowDialog,但这意味着您需要对Window(例如View)的引用才能实例化它.理想情况下,我应该能够在PreferencesDialog中对代码/验证进行单元测试,而无需实例化视图(可能使用Mock视图?).
我刚刚意识到我一直在强制绑定/依赖属性,而不是从根本上理解这个概念.
继承人属性:
public string Problem
{
get { return (string)GetValue(ProblemProperty); }
set { SetValue(ProblemProperty, value); }
}
public static readonly DependencyProperty ProblemProperty =
DependencyProperty.Register(
"Problem",
typeof(string),
typeof(TextBox));
Run Code Online (Sandbox Code Playgroud)
XAML如此:
<TextBlock Text="{Binding Path=Problem}"/>
Run Code Online (Sandbox Code Playgroud)
我手动将Problem属性设置为对象的构造函数中的值,但它不会相应地更新TextBlock...有任何想法吗?我已经尝试过Mode="OneWay"并且Mode="TwoWay"仍然无法正常工作.
我以为这应该自动运行?或者我从根本上弄错了什么?
谢谢
如何将ActualWidth用户控件的某个组件的属性公开给用户?
我已经找到了很多关于如何通过创建新的依赖项属性和绑定来公开普通属性的示例,但是没有关于如何公开只读属性的示例ActualWidth.