小编Fas*_*ons的帖子

MVVM标准化

Silverlight中有人发布 MVVM目前缺乏标准化,所以每个人都有自己的风味.

这就是为什么我和WPF门徒的一些人正在积极讨论每个人都同意的MVVM的哪些元素.我完全理解我们已经以不同的方式实现了模式,我们根据项目的需要混合了几种模式或创建了自己的模式,或者让开发人员的生活变得更轻松......但是忘记了这些困难或项目的特殊需求.让我们讨论一下每个人都同意的MVVM模式的标准规则.我也在这里发表了一些想法.

为何选择MVVM?

  • 可测试性(ViewModel比代码隐藏或事件驱动代码更容易进行单元测试)
  • 在UX设计人员和开发人员之间明确分离
  • 增加视图的"可混合性"
  • 永远不需要更改模型以支持对视图的更改
  • 很少需要更改ViewModel以支持对视图的更改
  • 没有重复的代码来更新视图

做和不看

  • 不应该包含任何你想要测试的逻辑:正如Glenn所说MVVM不是代码计算练习,我们可以在代码隐藏中编写代码.但是你永远不应该写任何你想要测试的逻辑.例如:如果用户选择国家/地区,则您希望在视图中显示州或城市列表.这是业务需求,因此您应该使用单元测试来测试此逻辑.所以,你不应该在代码隐藏中写它.
  • 可以是控件或数据模板
  • 保持视图尽可能简单.:我们仍然可以谨慎使用XAML中的数据触发器或值转换器或Visual State或Blend Behivor.
  • 如果某些东西不可绑定,请使用附加属性:

在ViewModel中做和不做

  • View和Model之间的连接器
  • 保持视图状态,值转换(您可以创建要在ViewModel中显示的数据结构,而不是使用ValueConverter.例如:您需要显示名称而不是名字和姓氏.您的模型可以具有名字和最后名称名称但您可以在ViewModel中创建Name属性.)
  • 没有强大或弱(通过接口)参考View
  • 使VM尽可能可测试(例如,不调用Singleton类)
  • VM中没有与控制相关的内容(因为如果要更改视图,则还必须更改VM.)

模型

  • 可以是数据模型,DTO,POCO,域类的自动生成代理和UI模型,基于您希望如何在域服务和表示层之间分离
  • 没有对ViewModel的引用

你有什么建议或评论吗?

我们小组中有一个分歧.有人说在ViewModel中有View的界面是可以的.但是有人说如果View Model有View接口,那么它将是MVP模式.

我们的一位MVVM专家谈到MVVM Vs MVP

View => ViewModel

  • MVVM视图直接绑定到ViewModel并通过数据绑定与VM通信
  • 在MVP中,视图绑定到悬挂在SupervisingController上的模型或者根本不绑定(被动视图).

ViewModel =>查看

MVVM

  1. INPC /属性绑定
  2. 活动
  3. 消息(Event Aggregator/Messenger/RX框架)
  4. 通过中介如服务
  5. 通过界面
  6. 通过委托(View将代理传递给VM,它可以用来调用它.例如,VM可能会公开一个SetActions方法,View调用它传递它委托的方法.

MVP

在MVP案例中,标准是Presenter通过接口,数据绑定或在被动视图的情况下通过属性与视图对话.使用被动视图时,属性不使用数据绑定,而是使用视图属性getter和setter来直接设置控件值.

你怎么看待这个想法?

你认为ViewModel有View的界面吗?

如果您想添加更多,欢迎您添加... :)

关于这篇文章的全部想法是对社区中的MVVM模式有相同的理解.

mvvm

12
推荐指数
1
解决办法
831
查看次数

撤消Textbox的功能

我正在为TextBox开发一个非常简单的撤销功能,我有一个奇怪的问题.当我尝试从Stack包含所有更改的字符串中取出字符串并将它们放在文本框中时,我看不到任何更改.

我做了一个小调试标签,以检查这是否真的有效.我发现它在标签中工作,但在文本框中它使用自己的撤销功能.

有没有办法取消或覆盖文本框撤消并使用我自己的功能?

以下是我所做的更改的示例代码:

 private void Form1_KeyDown(object sender, KeyEventArgs e)
        if (e.KeyCode == Keys.Z && (ModifierKeys & Keys.Control) == Keys.Control)
            {
                nameTextBox.Text = undoName.GetLastChange(); //--> not working

                undoDebuglabel.Text = undoName.GetLastChange(); --> working
            }
}
Run Code Online (Sandbox Code Playgroud)

GetLastChange()从Stack类中获取信息.

这就像文本框不让我看到变化.可能是因为我使用相同的快捷方式CTRL + Z来做吗?

c# winforms

5
推荐指数
1
解决办法
6585
查看次数

需要帮助在MVVMLight中使用Messaging编写单元测试用例

我是单元测试用例写作的新手.我在WPF中使用MVVMLigh.是否有必要使用一些第三方测试框架或.Net Unit测试框架呢?另外如何在单元测试用例中处理静态类?在这种情况下AppMessages类.

有人可以指导我如何编写以下代码的单元格:

public MyViewModel(Participant participant)
{    
    if (participant != null)
    {
        this.ParentModel = parentModel;
        OkCommand = new RelayCommand(() => OkCommandExecute());
        CalculateAmountCommand = new RelayCommand(() => CalculateAmount());        
    }
    else
    {
        ExceptionLogger.Instance.LogException(Constants.ErrorMessages.FinancialLineCanNotBeNull, "FinancialLineViewModel");
        AppMessages.DisplayDialogMessage.Send(Constants.ErrorMessages.FinancialLineCanNotBeNull, MessageBoxButton.OK, Constants.DefaultCaption, null);
    }
}

public static class AppMessages
{
    enum AppMessageTypes
    {
        FinancialLineViewDisplay,
        FinancialLineViewClose,
        DisplayDialogMessage
    }

    public static class DisplayDialogMessage
    {
        public static void Send(string message, MessageBoxButton button, string caption, System.Action<MessageBoxResult> action)
        {
            DialogMessage dialogMessage = new DialogMessage(message, action)
            {
                Button = button,
                Caption = caption …
Run Code Online (Sandbox Code Playgroud)

static-methods unit-testing testcase mvvm-light

3
推荐指数
1
解决办法
1468
查看次数