Por último artigo < WPF-MVVM padrão notas de estudo 2 - MVVM exemplo simples > na citou um exemplo, eu tenho um MVVM provavelmente significado relativamente simples. Ao mesmo tempo, as pessoas que lêem os dois artigos anteriores, eu também sei que a maior parte desta série de artigos de outros blog, eu realmente só jogou um resumo do papel, afinal de contas, eu estava aprendendo, e-learning é, certamente, vai em outras notas mim. Este artigo irá rever a maneira antiga de novo para entender MVVM, MVVM novamente buscou o entendimento de um nível profundo.
1. Look "MV-VM"
M: Isso Model, modelo abstraído do mundo real.
V: isto é, Vista, interface que interage com o dispositivo de entrada de utilizador.
Como 2.View interagir com o modelo?
Neste momento, a ligação pode desempenhar um papel, como um de caixa de texto e o texto no Model View "nome do usuário" em associação, os usuários podem ser acessados e modificados pela operação da caixa de texto Modelo "User Name" a. Mas na programação atual, descobrimos que a propriedade (ou método) Modelo muitas vezes não é tão fácil de ser associado com os controles de exibição de interface. Por exemplo, a definição da classe Time uma vez, a classe tempo Tempo tem o ano, mês, dia três propriedades, como se segue
public class Time
{
private string year;
public string Year
{
get
{
return this.year;
}
set
{
this.year = value;
}
}
private string month;
public string Month
{
get
{
return this.month;
}
set
{
this.month = value;
}
}
private string day;
public string Day
{
get
{
return this.day;
}
set
{
this.day = value;
}
}
public Time(string year, string month, string day)
{
this.year = year;
this.month = month;
this.day = day;
}
}
Bem como uma interface que TimeView, como se segue
Quero conseguir pressionar a tecla 1 vez em anos - para mostrar a forma de dia - mês; pressione o botão 2, o tempo em meses - na forma de show - dia. Neste caso, é necessário fazer algumas "operação extra", isto é, o modelo de dados em tempo após algum processamento adicional pode ser passado para a vista, e vice-versa. Agora, nós percebemos isso Ver parece exigir uma classe "Helper" para lidar com algum trabalho extra. Ajudante contém o código pode ser colocado do modelo (por exemplo, onde o Tempo), em muitos lugares fora, como na correspondente View.cs. E eu realmente fazer antes, a grande maioria do processamento de lógica na chamada CodeBehind no.
3. Mais tarde ...
Mais tarde, em vários padrões de design livros são vistos, a fim de descolar Ver e Modelo, Vista conseguir uma alternativa, houve a MVC. Depois Com MVC, eu comecei a ter MVP, MVVM e assim por diante MV-XX. Mas quase (eu adicionar um pouco dele, porque os outros padrões de projeto que não têm contato com) todos esses padrões de projeto são principalmente em torno de duas questões:
Em primeiro lugar, a relação entre o modelo ea visualização, completamente isolado? Unidirecional ou bidirecional?
Em segundo lugar, o "XX", que apresenta necessidade de completar um programador processo simples? Complicadas regras de processamento?
Esses problemas não estão relacionados, se a adotar um padrão dependendo do seu ambiente de desenvolvimento em que (tal como recursos de linguagem, características quadro) e as características de seu negócio e o principal ponto de mudança, e assim face.
4. Mas ...
Mas com MVC, MVP da diferença é que não só a introdução de razões técnicas MVVM (responder dissociado a mudanças clichê), outro grande motivo: mudar a maneira como a equipe de desenvolvimento de software. Precisamos de uma maneira de código de lógica Ver camada extraído, e a camada View é muito pura, a fim de construí-lo inteiramente à arte. Assim ,, Ver camada lógica respectivo precisa ser desenhado em uma camada de código para permitir que um programador se concentrar aqui. Isto requer:
① você tem a capacidade de usar Blend e outras ferramentas XAML para programadores saída de artistas, ele se concentrou em UI pura / UE, ele também deve ter um certo pensamento "programador", a fim de imprimir algo assim como um programa parte da execução, em vez de apenas "aparência" é assim;
Você precisa ser capaz ② de programador Ver camada, mas ainda pode escrever código de alta qualidade.
5. Binding, Command, attachBehavior
Lembre-se que a razão pela qual queremos escrever algum código (C #) em Vista (XAML) para trás, estava simplesmente tentando passar algum processamento de dados e transferência de dados quando os dados ou executar alguma ação quando o usuário interage com os controles de interface. O exemplo mais simples é a visão Controler para chamar um método na interface quando o MVC quando a interação ocorre, de modo que a operação correspondente "indica" transmitido para ir "fundo". Na técnica anterior, uma "ponte" código tal é necessário. No WPF, pode ser "acoplamento" entre as camadas por uma outra técnica, que é "o de ligação" e "de comando", e "attachBehavior."
Ao ligar, podemos passar dados para alcançar, através de comando, podemos invocar a execução de operações. Encadernação e comando é escrito em XAML, por isso parece por trás do arquivo XAML para o CS pode ser completamente abandonada ou ignorada, e esta é a arte de XAML arquivos necessários. Por estas definições descrevem Encadernação e de comando e outras informações relevantes do código deve ser colocado lá, é claro, não é um modo de exibição, mas não o modelo, é "ViewModel". Ver ViewModel para isso são tailor-made, que contém as informações relevantes necessárias para encadernação, e a prestação de tais Converter DataContext de vista de encadernação, que contém uma definição para Command View camada pode ser usado diretamente, além disso, é uma variante o Controler, foi responsável pela programação de processos de negócios.
A figura é exibição muito intuitiva Ver \ ViewModel \ Modelo de diagrama de interação, realmente admiro desenhar o autor da imagem, muito simples.
Então attachBehavior o que é? Usando as propriedades do WPF comando, Encadernação, AttachProperty similares sob circunstâncias normais, pode trabalhar bem com entre View e ViewModel. Suponha que temos um botão, o botão é clicado quando queremos executar alguma ação, pura e simplesmente, o operacional encapsulado em um comando e ligado ao botão sobre ele. Mas se queremos realizar algumas outras operações no momento em que foi Carga Botão de? Uma vez que o botão de comando não é acionado diretamente pelo evento de carga, para que você não pode usar o comando. Você não pode escrever diretamente para o manipulador de eventos de carga em XAML Botão onde o documento CS correspondente, e que acabamos de design MVVM é contraditória. não é uma boa solução é herdar o Button, e escreveu uma desencadeada pela carga de comando, isso é possível, mas, obviamente, não é bom, como um controle não tem uma propriedade e herança e sem o uso de AttachProperty, nós podemos usando attachBehavior.
6. ending
Aqui, eu entendo MVVM, mas também sabemos o papel do ViewModel, contanto que você pode usar este modelo para resolver o problema acima da exibição de tempo,
Adicionar classe TimeViewModel, como se segue
public class TimeViewModel : NotificationObject
{
private Time time;
public Time Time
{
get
{
return this.time;
}
set
{
this.time = value;
this.RaisePropertyChanged(() => this.time);
}
}
public TimeViewModel()
{
time = new Time("1991","02","23");
birthday = time.Year + "-" + time.Month + "-" + time.Day;
}
private string birthday;
public string Birthday
{
get
{
return this.birthday;
}
set
{
this.birthday = value;
this.RaisePropertyChanged("Birthday");
}
}
public bool CanSubmit
{
get
{
return true;
}
}
public void Submit1()
{
Birthday = time.Year + "-" + time.Month + "-" + time.Day;
}
public void Submit2()
{
Birthday = time.Month + "-" + time.Day + "-" + time.Year;
}
}
Neste ViewModel, a definição de uma seqüência de formato de data de aniversário para exibição, enquanto os dois métodos Submit1 () e Submit2 () são dois botões Clique ligações de eventos.
Neste momento, a visão Ver o conteúdo
<UserControl x:Class="MVVMDemo.View.TimeView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:vm="clr-namespace:MVVMDemo.ViewModel"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="gridLayout">
<Grid.DataContext>
<vm:TimeViewModel />
</Grid.DataContext>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5*" />
<ColumnDefinition Width="5*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="5*" />
<RowDefinition Height="5*" />
<RowDefinition Height="5*" />
<RowDefinition Height="5*" />
</Grid.RowDefinitions>
<TextBlock Text="Time:" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding Path=Birthday,Mode=Default}" Grid.Row="0" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Left"/>
<Button x:Name="Btn1" Content="按钮1:年-月-日" IsEnabled="{Binding CanSubmit}" Grid.Row="2" Grid.Column="0" Width="150" Height="50" VerticalAlignment="Center" HorizontalAlignment="Right">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:CallMethodAction TargetObject="{Binding}" MethodName="Submit1"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
<Button x:Name="Btn2" Content="按钮2:月-日-年" IsEnabled="{Binding CanSubmit}" Grid.Row="2" Grid.Column="1" Width="150" Height="50" VerticalAlignment="Center" HorizontalAlignment="Right">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:CallMethodAction TargetObject="{Binding}" MethodName="Submit2"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
</Grid>
</UserControl>
Compilar e executar o programa (o projecto clique aqui para baixar )
(2,23 meu aniversário está chegando, não sei ninguém vai se lembrar, huh, huh)
fonte
Obrigado meu amigo! ! Você disse muito fácil de entender! !