相关疑难解决方法(0)

MVVM路由和中继命令

什么是之间的差异的RoutedCommandRelayCommand?何时使用RoutedCommand以及何时在MVVM模式中使用RelayCommand?

command mvvm relaycommand routedcommand

75
推荐指数
4
解决办法
5万
查看次数

在MVVM中,ViewModel响应View中用户操作的最佳方式是什么?

我理解在MVVM中:

  • View了解ViewModel
  • ViewModel了解Model
  • 但它没有向上工作,因此模型对ViewModel一无所知
  • 并且ViewModel对View一无所知

那么ViewModel如何响应用户对View所做的操作,例如在TextBox中键入内容或移动滑块等.

  1. 我知道这是通过RoutedEvents完成的,但我发现几乎所有的RoutedEvent示例都在View中使用CodeBehind,这正是你在MVVM中不再拥有的.

  2. 因此留下RoutedCommands我在MVVM中找到了更多的例子,但是例如移动滑块确实不是这个意义上的命令,它是一个事件,所以我想知道这是否真的应该使用.

  3. 然后,我读的意见,如" 在MVVM 使用RoutedEvents尽可能少,并没有RoutedCommands可言. " OK.

  4. 因此,例如在WPF模型 - 视图 - 视图模型工具包0.1项目中,自己就会形成一个" DelegateCommand ",它看起来也像一个有趣的方式.

  5. 然后有些人也在使用" RelayCommand ".

对于开发应用程序这样核心的事情,这是很多选择和困惑.

在MVVM中简单地完成我们过去10年使用Code Behind所做的工作的最佳方法是什么:

  • 创建按钮
  • 双击按钮
  • 写处理代码

wpf mvvm

21
推荐指数
2
解决办法
5693
查看次数

大智能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
查看次数

如何(正确)更新WPF应用程序的MVVM中的M?

已经通过了一系列爱德华Tanguay的问题折射MVF应用程序的MVVM的使用,可以在他的Fat Models的链接侧边栏,瘦瘦的ViewModels和哑视图中找到,这是最好的MVVM方法吗?,他对Big smart ViewModels中的最终WPF应用程序,哑视图和任何模型,最好的MVVM方法感到有些困惑

它的M(模型)是客户类:

//model
public class Customer
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime TimeOfMostRecentActivity { get; set; }

    public static Customer GetCurrentCustomer()
    {
        return new Customer 
                   { FirstName = "Jim"
                     , LastName = "Smith"
                     , TimeOfMostRecentActivity = DateTime.Now 
                   };
    }

}
Run Code Online (Sandbox Code Playgroud)

返回当前用户.好吧,因为它返回了新创建的"当前"用户的重复...

但是在需要的情况下,M的数据存储和更新在哪里?

假设,我想将模型的当前用户更改FirstName为"Gennady"?

我添加了一个按钮,用于使用此按钮单击事件处理程序更新模型:

private void button1_Click(object sender, RoutedEventArgs e)
{ …
Run Code Online (Sandbox Code Playgroud)

c# wpf conceptual mvvm

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