WPF-MVVM notas de estudo padrão 3 - conceito MVVM cavar novamente

     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

http://www.csdn123.com/itweb.php?url=aHR0cDovL3d3dy5jbmJsb2dzLmNvbS9XaW5kb3dzLXBob25lL2FyY2hpdmUvMjAxMy8wOC8yNC8zMTE1ODIzLmh0bWw=

Obrigado meu amigo! ! Você disse muito fácil de entender! !

发布了143 篇原创文章 · 获赞 161 · 访问量 121万+

Acho que você gosta

Origin blog.csdn.net/mybelief321/article/details/44459535
Recomendado
Clasificación