WPF:MVVM在哪里停止,代码隐藏从哪里开始?

WPF:MVVM在哪里停止,代码隐藏从哪里开始?,wpf,mvvm,code-behind,Wpf,Mvvm,Code Behind,我创建了一个窗口,其中有一个列表视图,用于显示人员集合。还有3个TextBoxes,用来显示一个人的名字、姓氏和年龄。最后,还有一个按钮保存在那些文本框中输入的新人员数据 通过实现MVVM将人员加载到列表视图中。工作起来很有魅力!此外,通过单击按钮向集合中添加新成员也可以通过MVVM完成 但是有两个用例我不确定使用命令是否更明智,即MVVM,还是纯代码隐藏。用例包括: 当用户从列表视图中选择一个人时,文本框es应显示该人 细节 当用户在显示的文本框中键入字符而不是数字时 根据个人年龄,应警告其输

我创建了一个窗口,其中有一个
列表视图
,用于显示人员集合。还有3个
TextBox
es,用来显示一个人的名字、姓氏和年龄。最后,还有一个
按钮
保存在那些
文本框
中输入的新人员数据

通过实现MVVM将人员加载到
列表视图中。工作起来很有魅力!此外,通过单击
按钮
向集合中添加新成员也可以通过MVVM完成

但是有两个用例我不确定使用命令是否更明智,即MVVM,还是纯代码隐藏。用例包括:

  • 当用户从
    列表视图
    中选择一个人时,
    文本框
    es应显示该人 细节
  • 当用户在显示的
    文本框中键入字符而不是数字时
    根据个人年龄,应警告其输入的数据不正确
    我之所以怀疑是否应该使用MVVM或代码隐藏,是因为这两个用例都与仅查看(GUI)相关,即与模型或应用程序业务逻辑没有交互。
    列表视图
    项目源绑定到人员的集合
    可观察集合
    ,当
    列表视图
    中填充项目时,与所选人员相关的所有数据都已传递到视图。在第二个用例中,同样地,不需要转到ViewModel来让它触发关于错误用户输入的消息框。改为在ViewModel类的age dependency属性中创建验证回调如何


    感谢所有的澄清

    当ListView选择发生变化时,文本框可以而且应该通过XAML中的绑定来填充,例如:

    <ListView Name="people" .../>
    
    <TextBox Text="{Binding ElementName=people, Path=SelectedItem.FirstName}"/>
    
    
    
    或者,为了减少编码,将文本框与DataContext集一起放在它们自己的面板中,例如:

    <Grid DataContext="{Binding ElementName=people, Path=SelectedItem}">
        <TextBox Text="{Binding Path=FirstName}"/>
        <TextBox Text="{Binding Path=LastName}"/>
    </Grid>
    
    
    

    验证可以连接到XAML中,但执行验证的代码通常在类中实现。
    System.Windows.Controls
    中有一个方便的抽象类,名为
    ValidationRule
    ,可用于快速创建验证器。请参阅以获取示例。

    您可以使用a进行绑定。它不会显示消息框(尽管可能),但您可以定义一个显示错误的
    错误模板。

    MVVM背后的主要动机是分离关注点,即将逻辑与表示分离。 您所描述的内容(搜索和验证)在我看来更具“逻辑性”,因此我会将其放在ViewModel中(当然,假设它不能通过数据绑定执行)

    • 请记住,视图很难测试,因此,如果您正在实现的逻辑有可能出现重大错误,那么就有理由将其放入viewModel中

    • 另一种(半严肃但通常有效)的方法是,如果您将视图(窗口、用户控件或其他)提供给图形设计师(即使您没有视图,也要假装您有视图),则会发生什么情况,以确定某个对象是否属于模型或viewModel。如果你同意他的想法,他可以把他的c#无能[*]的手放在后面的代码上(并把它弄得一团糟),这通常是一个迹象,表明代码与表示严格相关,可以安全地生活在视图中。 大多数情况下,最终会将其移动到ViewModel


    [*]只是出于教育目的,许多设计师比我更能胜任c:-)

    我唯一开始将代码放入代码隐藏文件的时候是当我无法将代码放入ViewModel或对象图的更深处时

    例如,如上所述,第一种情况是完全可以在XAML代码中解决。没有必要求助于代码隐藏来实现这种效果。这个例子可以扩展到与集合的交互,这些集合不一定出现在列表框之类的控件中。您可以编写XAML代码,通过绑定响应ViewModel中集合中当前项的更改

    第二种情况也可以通过ViewModel中的dvalidation工具以及使用XAML将数据绑定到这些工具来实现。IDataErrorInfo是一个内置的用于此目的的强大机制。演示IDataErrorInfo的简单用法

    当你不得不陷入代码落后的时候,希望很少有这样的例子。我遇到的一个例子是,当一个控件不支持ICommand,并且您无法将功能绑定到行为元素时,一个示例控件就是一个ListBox。但是有一些技术可以绕过这个限制。此外,如果需要在自定义控件中重写呈现,则需要在代码隐藏或继承类中执行此操作


    希望这能给答案增加一些有用的信息。

    回答得好,我这边再问一个问题。当视图必须有其他模式窗口时,单击一个按钮,我将得到一个Messagebox。我需要在代码隐藏中创建这样的窗口吗?这是一个棘手的问题。例如,“纯”消息框(Yes/No/Cancel)仍然可以在代码隐藏中完成,但我发现有更好的方法来创建用户体验。现在,除了“是/否/取消”功能之外,一个模式窗口通常应该有一个viewmodel和一个用于演示的伴随视图。这是一个非常好的关于这个主题的问题/答案。