相关疑难解决方法(0)

在MVVM中,ViewModel或Model应该实现INotifyPropertyChanged吗?

我经历过的大多数MVVM示例都使用了Model实现INotifyPropertyChanged,但在Josh Smith的CommandSink示例中 ,ViewModel实现了INotifyPropertyChanged.

我还在认知上把MVVM概念放在一起,所以我不知道是否:

  • 你必须将INotifyPropertyChanged放在ViewModel中以使CommandSink工作
  • 这只是常态的失常,并不重要
  • 你应该总是有Model实现INotifyPropertyChanged,这只是一个错误,如果从代码示例开发到应用程序,这将被纠正

您曾参与MVVM项目的其他经历是什么?

c# mvvm inotifypropertychanged

155
推荐指数
7
解决办法
4万
查看次数

WPF综合指南:MVVM与MVP

我很迷惑.也许你可以帮帮我:)

我一直在遵循CAG的指导,发现MVP模式对我来说非常自然.假设我有一个支持UI的模型(例如:实现INotifyPropertyChanged),我使用演示者将此模型绑定到视图(演示者知道视图的接口),保持我的Code-Behind尽可能小只处理Bindings(模型和命令)属性(或方法)或没有ICommand的控件的事件,在这种情况下立即委托给演示者.

  1. 过了一会儿,我发现了MVVM模式,到目前为止它还没有找到我.据我所知,只有当我的模型不支持UI时,我才会使用MVVM.但是保持演示者并使用新模型更合理,我无法理解这种用法​​会让我失去什么.我知道我错过了什么,但它是什么:).

  2. 此外,当您的View是通用的并且可以处理多种模型时(例如在PropertyGrid中).建议将ViewModel与DataTemplate一起使用,但在这种情况下,您无法为模型中的每个实体创建模板,只需要在运行时进行调查,您会建议什么?

  3. 在观看Josh Smith在屏幕录像中谈论MVVM时,我感觉到ViewModel中模型的重新暴露违反了DRY(不要重复自己),这真的是不可避免的吗?令人惊讶的是,与ADO.Net动态数据元数据类的火焰相比,他现在没有人在争论它.

希望它足够清楚

谢谢

阿里尔

wpf mvp design-patterns prism mvvm

16
推荐指数
4
解决办法
1万
查看次数

大智能ViewModels,哑视图和任何模型,最好的MVVM方法?

下面的代码是我以前的MVVM方法的重构(Fat Models,瘦的ViewModels和dumb Views,最好的MVVM方法?),我将逻辑和INotifyPropertyChanged实现从模型中移回ViewModel.这更有意义,因为正如所指出的,您经常必须使用您无法更改或不想更改的模型,因此您的MVVM方法应该能够使用任何模型类,因为它碰巧存在.

此示例仍允许您在Visual Studio和Expression Blend中以设计模式查看模型中的实时数据,我认为这很重要,因为您可以拥有设计器连接的模拟数据存储,例如最小和最大的字符串. UI可能会遇到,以便他可以根据这些极端情况调整设计.

问题:

  • 我有点惊讶我甚至不得不在我的ViewModel中"放一个计时器",因为它似乎是INotifyPropertyChanged的一个功能,它似乎是多余的,但这是我可以不断获得XAML UI的唯一方法(一次)每秒)反映我的模型的状态.因此,如果您遇到任何不利因素,例如使用线程或性能,那么听到任何可能采用这种方法的人都会很有趣.

如果您只是将XAML和代码复制到新的WPF项目中,则以下代码将起作用.

XAML:

<Window x:Class="TestMvvm73892.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestMvvm73892"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <ObjectDataProvider 
              x:Key="DataSourceCustomer" 
              ObjectType="{x:Type local:CustomerViewModel}" 
             MethodName="GetCustomerViewModel"/>
    </Window.Resources>

    <DockPanel DataContext="{StaticResource DataSourceCustomer}">
        <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
            <TextBlock Text="{Binding Path=FirstName}"/>
            <TextBlock Text=" "/>
            <TextBlock Text="{Binding Path=LastName}"/>
        </StackPanel>
        <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
            <TextBlock Text="{Binding Path=TimeOfMostRecentActivity}"/>
        </StackPanel>

    </DockPanel>

</Window>
Run Code Online (Sandbox Code Playgroud)

代码背后:

using System;
using System.Windows;
using System.ComponentModel;
using System.Threading;

namespace TestMvvm73892
{
    public partial class Window1 …
Run Code Online (Sandbox Code Playgroud)

c# architecture wpf mvvm

8
推荐指数
1
解决办法
3215
查看次数