A criação de um idioma do Windows baseada em formulários específicos do domínio
Você pode usar o windows forms para exibir o estado de um modelo específica de domínio language (DSL), em vez de usar um diagrama de DSL.Este tópico anda você associar com formulários da DSL, usando o visualizador de Visual Studio e modelagem SDK.
Uma instância de DSL, mostrar o windows interface do usuário e o modelo.
Criar um windows form DSL
O modelo de designer mínimo de WinForm DSL cria DSL mínimo que você pode alterar para satisfazer seus próprios requisitos.
para criar um WinForms mínimo DSL
Crie DSL do modelo de designer mínimo de WinForm .
Em este passo-a-passo, os seguintes nomes são considerados:
solução e nome de DSL
FarmApp
Namespace
Company.FarmApp
experiência com o exemplo inicial que o modelo fornece:
transformar todos os modelos.
Compilar e executar o exemploCTRL + f5().
Em a instância de avaliação do Visual Studio, abra o arquivo de Sample no projeto de depuração.
Observe que é exibido em um controle de formulários do windows.
Você também pode ver os elementos do modelo exibido no Explorer.
Adicionar alguns elementos no formulário ou no Explorer, e observe que aparecem na outra exibição.
Em a instância principal de Visual Studio, observe os seguintes pontos sobre a solução de DSL:
DslDefinition.dsl não contém elementos de diagrama.Isso ocorre porque você não usará diagramas de DSL para exibir modelos de instância de esse DSL.Em vez de isso, você associará o windows forms o modelo, e os elementos no formulário exibirão o modelo.
Além dos projetos de Dsl e de DslPackage , a solução contém um projeto chamado terceiro projeto de UI.Interface de Usuário contém a definição de um controle de formulários do windows.DslPackage depende de UI, e UI depende de Dsl.
Em o projeto de DslPackage , UI\DocView.cs contém o código que exibe o controle de formulários do windows que é definido no projeto de UI .
O projeto de UI contém uma amostra funcionando de um controle do formulário associado a DSL.Em o entanto, não funcionará quando você alterou a definição de DSL.O projeto de UI contém:
Os formulários do windows classe ModelViewControlchamado.
Um arquivo chamado DataBinding.cs que contém uma definição parcial adicional de ModelViewControl.Para ver seu conteúdo, em Gerenciador de Soluções, abra o menu de atalho para o arquivo e clique Exibir Código.
Sobre o projeto de interface de usuário
Quando você atualiza o arquivo de definição de DSL para definir seu próprio DSL, você terá que atualizar o controle no projeto de UI exibir seu DSL.A o contrário dos projetos de Dsl e de DslPackage , o projeto de UI de exemplo não é gerado de DslDefinitionl.dsl.Você pode adicionar arquivos de .tt para gerar código se você desejar, embora isso não é abordado em essa explicação passo a passo.
atualizando a definição de DSL
O seguinte a definição de DSL é usado em este passo-a-passo.
para atualizar a definição de DSL
DslDefinition.dsl aberto no designer de DSL.
Excluir ExampleElement
Renomeie a classe do domínio de ExampleModel a farm.
Ela das propriedades adicionais do domínio Tamanho chamada do tipo Int32, e a IsOrganic de tipo Booliano.
Observação Se você excluir a classe de domínio raiz e então cria uma nova raiz, você precisará reiniciar a propriedade da classe da raiz do editor.Em DSL Explorer, Editorselecione.Em a janela propriedades, defina Classe raiz a farm.
Use a ferramenta de Domínio chamado Classificação para criar as seguintes classes de domínio:
IssoCampo – de uma propriedade chamada adicional do domínio Tamanho.
animal – na janela propriedades, defina Modificador de herança a Resumo.
use a ferramenta de Classe de domínio para criar as seguintes classes:
carneiros
cabra
use a ferramenta de Herança para fazer cabra e carneiros herdar de animal.
Use a ferramenta de Incorporação para inserir Campo e animal em farm.
Você pode desejar arrumar o diagrama.Para reduzir o número de elementos duplicados, use o comando de Trazer a subárvore aqui no menu de atalho de elementos da folha.
Transformar Todos os Modelos na barra de ferramentas do solution Explorer.
Compile o projeto de Dsl .
Observação Em esta etapa, os outros projetos não compilarão sem erros.Em o entanto, queremos compilar o projeto de Dsl de modo que o assembly estão disponíveis para o assistente da fonte de dados.
Atualizando o projeto de interface de usuário
Agora você pode criar um novo controle de usuário que exibe informações que estão armazenadas no modelo de DSL.A maneira mais fácil de se conectar o controle de usuário ao modelo é através das associações de dados.O tipo de associação do adaptador de dados chamado OrigemDaAssociaçãoDeModelagem é projetado especificamente para se conectar DSLs às interfaces de non-VMSDK.
para definir seu DSL modelar como uma fonte de dados
Em o menu de Dados , escolha Mostrar Fontes de Dados.
A janela Data Sources é aberta.
Escolha Adicionar Nova Fonte de Dados.O Data Source Configuration Wizard é aberto.
Escolha Objeto, Avançar.
Expanda Dsl, Company.FarmApp, e selecione Farm, que é a classe raiz do seu modelo.Escolha Concluir.
Em o solution Explorer, o projeto de Interface de Usuário agora contém Properties\DataSources\Farm.datasource
As propriedades e relacionamentos de sua classe modelo aparecem na janela fontes de dados.
Para conectar seu modelo para um formulário
Em o projeto de Interface de Usuário , excluir todos os arquivos existentes. cs
Adicione um novo arquivo de Controle do UsuárioFarmControl chamado ao projeto de Interface de Usuário .
Em a janela de Fontes de Dados , no menu suspenso em Farm, escolha Detalhes.
deixe as configurações padrão para as outras propriedades.
Abra FarmControl.cs no modo design.
Arraste Farm da janela fontes de dados em FarmControl.
um conjunto de controles aparece, um para cada propriedade.As propriedades do relacionamento não geram controles.
Excluir farmBindingNavigator.Isso também é gerado automaticamente no designer de FarmControl , mas não é útil para este aplicativo.
usando a caixa de ferramentas, crie duas instâncias de Exibição em Grade de Dados, e nomeie-as AnimalGridView e FieldGridView.
Observação Uma etapa alternativo é arraste os animais e coloca itens da janela fontes de dados no controle.Essa ação cria automaticamente grades e associações de dados entre o modo de grade e a fonte de dados.Em o entanto, essa associação não funciona corretamente para DSLs.Portanto é melhor criar manualmente grades e as associações de dados.
Se a caixa de ferramentas não contém a ferramenta de OrigemDaAssociaçãoDeModelagem , adicione.Em o menu de atalho do guia de Dados , escolha Escolher Itens.Em a caixa de diálogo de Escolher Itens de Caixa de Ferramentas , selecione OrigemDaAssociaçãoDeModelagem de guia do .NET Framework.
usando a caixa de ferramentas, crie duas instâncias de OrigemDaAssociaçãoDeModelagem, e nomeie-as AnimalBinding e FieldBinding.
Defina a propriedade de DataSource de cada OrigemDaAssociaçãoDeModelagem a farmBindingSource.
Defina a propriedade de DataMember a animais ou a Campos.
definir as propriedades de DataSource de AnimalGridView a AnimalBinding, e de FieldGridView a FieldBinding.
Ajuste o layout do controle de farm ao seu gosto.
OrigemDaAssociaçãoDeModelagem É um adaptador que executa várias funções que são específicas para DSLs:
Envolve atualizações em uma transação de armazenamento de VMSDK.
Por exemplo, quando o usuário excluir uma linha de grade o modo de exibição de dados, uma associação normal resultaria em uma exceção de transação.
Certifique-se de que, quando o usuário seleciona uma linha, a janela properties exibe as propriedades do elemento modelo correspondente, em vez da linha de grade de dados.
Esquema de links entre fontes de dados e modos de exibição.
para concluir as associações a DSL
Adicione o seguinte código em um arquivo separado de código no projeto de Interface de Usuário :
using System.ComponentModel; using Microsoft.VisualStudio.Modeling; using Microsoft.VisualStudio.Modeling.Design; namespace Company.FarmApp { partial class FarmControl { public IContainer Components { get { return components; } } /// <summary>Binds the WinForms data source to the DSL model. /// </summary> /// <param name="nodelRoot">The root element of the model.</param> public void DataBind(ModelElement modelRoot) { WinFormsDataBindingHelper.PreInitializeDataSources(this); this.farmBindingSource.DataSource = modelRoot; WinFormsDataBindingHelper.InitializeDataSources(this); } } }
Em o projeto de DslPackage , edição DslPackage \ DocView.tt atualizar a seguinte definição variável:
string viewControlTypeName = "FarmControl";
testando DSL
A solução de DSL agora pode compilar e executar, embora você possa desejar adicionar posteriormente uma aprimoramentos adicionais.
para testar DSL
Criar e executar a solução.
Em a instância de avaliação do Visual Studio, abra o arquivo de Exemplo .
Em FarmApp Explorer, abra o menu de atalho no nó raiz de Farm , e escolha Adicione um novo cabra.
Goat1 aparece no modo de animais .
Cuidado Você deve usar o menu de atalho no nó de Farm , não o nó de animais .
Selecione o nó raiz de Farm e exibir suas propriedades.
Em o modo do formulário, altere Nome ou Tamanho de farm.
Quando você navega fora de cada campo no formulário, a propriedade correspondente alterações na janela propriedades.
aprimorando DSL
Para fazer imediatamente a atualização de propriedades
Em o modo design de FarmControl.cs, selecione um campo simples como o nome, o tamanho ou o IsOrganic.
Em a janela de propriedades, expanda Ligações de dados e abra (Avançado).
Em a caixa de diálogo de Formatação e Associação Avançada , em Modo de Atualização da Fonte de Dados, escolha OnPropertyChanged.
Criar e executar a solução.
Verifique que quando você modificar o conteúdo do campo, a propriedade correspondente do modelo de farm foi alterado imediatamente.
Para fornecer adicionar botões
Em o modo design de FarmControl.cs, use a caixa de ferramentas para criar um botão no formulário.
Edite o nome e o texto do botão, por exemplo a novos carneiros.
Abra o código do botão (por exemplo clicando duas vezes no).
Edite a seguinte maneira:
private void NewSheepButton_Click(object sender, EventArgs e) { using (Transaction t = farm.Store.TransactionManager.BeginTransaction("Add sheep")) { elementOperations.MergeElementGroup(farm, new ElementGroup(new Sheep(farm.Partition))); t.Commit(); } } // The following code is shared with other add buttons: private ElementOperations operationsCache = null; private ElementOperations elementOperations { get { if (operationsCache == null) { operationsCache = new ElementOperations(farm.Store, farm.Partition); } return operationsCache; } } private Farm farm { get { return this.farmBindingSource.DataSource as Farm; } }
Você também precisará insira a seguinte diretiva:
using Microsoft.VisualStudio.Modeling;
Adicionar botões semelhantes para cabras e campos.
Criar e executar a solução.
Verifique se o novo botão adiciona um item.O novo item deve aparecer no FarmApp Explorer e modo apropriado de grade de dados.
Você deve ser capaz de editar o nome do elemento no modo de grade de dados.Você também pode excluí-la de aí.
sobre o código para adicionar um elemento
Para novos botões do elemento, o código a seguir alternativo é ligeiramente mais simples.
private void NewSheepButton_Click(object sender, EventArgs e)
{
using (Transaction t = farm.Store.TransactionManager.BeginTransaction("Add sheep"))
{
farm.Animals.Add(new Sheep(farm.Partition)); ;
t.Commit();
}
}
Em o entanto, esse código não definir um nome padrão para o novo item.Não realiza nenhuma mesclagem personalizado que você possa ter definido em Diretivas de mesclagem do elemento de DSL, e não realiza nenhum código personalizado de mesclagem que pode ter sido definido.
Portanto é recomendável que você use ElementOperations para criar novos elementos.Para obter mais informações, consulte Personalizando a movimentação e criação de elemento.
Consulte também
Conceitos
Como definir uma linguagem específica de domínio
Visualização e modelagem SDK - linguagens específicas de domínio
Outros recursos
Escrever código para personalizar uma linguagem específica de domínio