Información general sobre la personalización y creación de formularios con la herramienta de creación de Service ManagerOverview of customizing and authoring forms with the Service Manager Authoring Tool

Se aplica a: System Center 2016 - Service ManagerApplies To: System Center 2016 - Service Manager

Un formulario es una ventana que permite a los usuarios interactuar con objetos de la base de datos.A form is a window that makes it possible for users to interact with objects from the database. Los usuarios pueden utilizar los formularios para ver y editar las propiedades de los objetos.Users can use a form to view and edit the properties of objects. Cada formulario está enlazado a una clase concreta y muestra únicamente la información de las instancias de la clase de destino.Each form is tied to a specific class, and it displays information only for instances of the targeted class. Los formularios contienen campos.A form contains fields. Normalmente, cada campo se enlaza a una propiedad específica de la clase de destino del formulario.Typically, each field is bound to a specific property of the form's targeted class. Por ejemplo, el formulario de incidente está enlazado al objeto incidente.The incident form, for example, is tied to the incident object. Por lo tanto, el formulario de incidente muestra información acerca de los objetos de incidentes de la base de datos.Therefore, the incident form displays information about incident objects in the database.

Un formulario de Service Manager consta de Windows Presentation Foundation (WPF) forman la implementación en Microsoft .NET ensamblado de Framework y una definición del formulario en un módulo de administración de Service Manager.A Service Manager form consists of the Windows Presentation Foundation (WPF) form implementation in a Microsoft .NET Framework assembly and a form definition in a Service Manager management pack. La definición del formulario especifica la clase que representa el formulario, junto con las restantes propiedades del formulario.The form definition specifies the class that the form represents, along with the other properties of the form.

Conceptos básicos acerca de los formulariosKey concepts about forms

Para poder personalizar formularios, debe estar familiarizado con los siguientes conceptos de formulario.Before customizing forms, you should be familiar with the following form concepts.

¿Cómo se utilizan los formularios?How forms are used

Cuando el módulo de administración que contiene las definiciones de formulario se importa a Service Manager, las definiciones de formulario se almacenan en la base de datos.When the management pack that contains the form definitions is imported into Service Manager, the form definitions are stored in the database. Más adelante, cuando el usuario inicia una tarea de la consola de administrador de servicios que requiere la visualización de un objeto, Service Manager debe encontrar un formulario para mostrar el objeto solicitado.Later, when the user initiates a Service Manager console task that requires the display of an object, Service Manager must find a form to display the requested object. Service Manager tiene acceso a la base de datos y busca un formulario que se haya definido para ese objeto.Service Manager accesses the database and searches for a form that has been defined for that object. Si no hay ningún formulario definido para el objeto, Service Manager busca un formulario que está definido para primario del objeto el objeto.If no form is defined for the object, Service Manager searches for a form that is defined for the object's parent object. Service Manager continúa buscando la jerarquía de herencia del objeto completo hasta que encuentra un formulario definido.Service Manager continues to search the entire object's inheritance hierarchy until it finds a defined form.

Formularios genéricosGeneric forms

Si Service Manager no encuentra ningún formulario para el objeto o para cualquiera de su elemento primario objetos, Service Manager crea dinámicamente un valor predeterminado formulario genérico para ese objeto.If Service Manager cannot find any form for the object or for any of its parent objects, Service Manager dynamically builds a default generic form for that object. El formulario genérico es un sistema-generado de forma que sea suficiente para su uso de forma sencilla.The generic form is a system-generated form that is sufficient for simple form use. El formulario genérico representa una forma rápida y fácil para crear un formulario para objetos sin definiciones de formulario.The generic form represents a quick and easy way to create a form for objects without any form definitions.

De forma predeterminada, el formulario genérico muestra todas las propiedades de formulario en un diseño sencillo que no se puede cambiar.By default, the generic form displays all the properties of the form in a simple layout that you cannot change. El formulario genérico muestra las propiedades de todos los objetos principales en la jerarquía de herencia del formulario y este comportamiento no se puede cambiar.The generic form displays the properties of all the parent objects in the inheritance hierarchy of the form, and you cannot change that behavior. Las personalizaciones en el formulario genérico están limitadas.Customizations to the generic form are limited. Por ejemplo, puede especificar las propiedades que desea que el formulario genérico muestre; sin embargo, el formulario genérico no se puede utilizar como base para la personalización.For example, you can specify the properties that you want the generic form to display; however, the generic form cannot be used as a basis for customization. Si, posteriormente, define un formulario personalizado para ese objeto, el formulario personalizado sobrescribe el formulario genérico del objeto.If you later define a custom form for that object, your custom form overwrites the object's generic form.

Para obtener información sobre la ocultación de propiedades en un formulario genérico y otras formas de personalización de un formulario genérico, consulte la entrada de blog Overview of the Forms Infrastructure and the Generic Form (Introducción a la infraestructura de formularios y al formulario genérico).For information about hiding properties in a generic form and other ways that you can customize a generic form, see the blog post Overview of the Forms Infrastructure and the Generic Form.

Clases de combinación de formulariosCombination classes in forms

En ocasiones, es necesario que un formulario muestre la información que se deriva de más de una clase.Sometimes, you need a form to display information that is derived from more than one class. Para ello, cree una clase de combinación y, a continuación, enlace un campo del formulario a la clase de combinación.To do this, you create a combination class and then bind a field on the form to the combination class. Para obtener más información acerca de las clases de combinación, vea cambios en el esquema común de System Center.For more information about combination classes, see Changes to the System Center Common Schema.

Aspectos funcionales de un formularioFunctional aspects of a form

Un formulario tiene los siguientes aspectos funcionales:A form has the following functional aspects:

  1. InicializaciónInitialization

  2. Tamaño y ubicaciónSize and location

  3. ActualizarRefresh

  4. Enviar cambiosSubmit changes

    Estos aspectos se describen en las secciones siguientes.These aspects are described in the following sections.

InicializaciónInitialization

Durante la inicialización, un formulario de Extensible Application Markup Language (XAML) se analiza y se crea una instancia y se cargan todos los controles del formulario.During initialization, a form's Extensible Application Markup Language (XAML) is parsed and all controls on the form are instantiated and loaded. El formulario Loaded evento indica cuándo se han cargado el formulario y todos los elementos contenidos.The form's Loaded event indicates when the form and all contained elements have been loaded. Datos-las operaciones de carga son asincrónicas.Data-loading operations are asynchronous. Por lo tanto, es posible que la instancia de destino no esté disponible cuando se produzca el evento Loaded .Therefore, the target instance may not be available when the Loaded event is raised. En su lugar, utilice el evento DataContextChanged para la notificación si la instancia de destino está establecida para el formulario.Instead, the DataContextChanged event must be used for notification when the target instance is set for the form. Puede utilizar el evento PropertyChanged para la propiedad DataContext en lugar del evento DataContextChanged .The PropertyChanged event for the DataContext property can be used in place of the DataContextChanged event.

Se recomienda que realice la Loaded eventos para el control de-relacionados con la inicialización personalizada y, a continuación, usar el DataContextChanged o PropertyChanged eventos en el DataContext propiedad para la instancia de destino-relacionados con la inicialización personalizada.We recommend that you use the Loaded event for control-related custom initialization and then use the DataContextChanged or PropertyChanged events on the DataContext property for target instance-related custom initialization.

Tamaño y ubicaciónSize and location

Cuando un formulario se muestra en una extracción-una ventana, su tamaño inicial se determina en función del formulario ancho, alto, MinWidth, y MinHeight propiedades.When a form is displayed in a pop-up window, its initial size is determined based on the form's Width, Height, MinWidth, and MinHeight properties. Si no se establecen estas propiedades para el formulario, el tamaño del formulario inicial se calcula en función de su contenido.If these properties are not set for the form, the form's initial size is calculated based on its content.

Es recomendable establecer estas propiedades de la forma siguiente:We recommend that you set these properties as follows:

  • Establezca las propiedades Width y Height del formulario para especificar explícitamente el tamaño ideal.Set the Width and Height properties of the form to explicitly specify the ideal size. Considere la posibilidad de establecer estas propiedades en el valor Auto .Consider setting these properties to the Auto value. Así se establece el ancho y el alto del formulario en función del tamaño del contenido.This sets the width and height of the form based on the size of the content.

  • Establezca las propiedades MinWidth y MinHeight del formulario para especificar la ventana más pequeña aceptable para el formulario.Set the MinWidth and MinHeight properties of the form to specify the smallest window acceptable for the form. Si un usuario cambia el tamaño de la ventana por un tamaño inferior al especificado, aparecen barras de desplazamiento para desplazarse hasta el contenido oculto del formulario.If a user resizes the window to a smaller size than specified, scrollbars appear for scrolling to the hidden form content.

    Si el formulario está hospedado dentro del host de formularios de Service Manager, la última-tamaño utilizado y la ubicación se conserva para su posterior presentación de ese formulario por el mismo usuario en la misma sesión de ejecución.When the form is hosted inside the Service Manager forms host, the last-used size and location is preserved for subsequent display of that form by the same user within the same run session.

ActualizarRefresh

La instancia de destino de un formulario puede cambiar como resultado de la ejecución de un comando Refresh en el formulario.The target instance of a form can change as a result of executing a Refresh command on the form. El controlador para este comando captura los datos nuevos de la base de datos.The handler for this command fetches new data from the database. Cuando llegan los datos, el formulario DataContext valor de la propiedad se establece en la nueva instancia de destino y el DataContextChanged evento se desencadena.When the data arrives, the form's DataContext property value is set to the new target instance and the DataContextChanged event is raised.

Para diferenciar entre el evento DataContextChanged , que se produjo la primera vez que se cargó el formulario, y el evento que se produjo para controlar un comando Refresh , compruebe la propiedad OldValue de los argumentos del evento que se pasan con el mismo.To differentiate between the DataContextChanged event that was raised when the form was first loaded and the event that was raised to handle a Refresh command, check the OldValue property of the event arguments that are passed in with the event. Esta propiedad es nula si se acaba de inicializar el formulario.This property is null if the form has just been initialized.

Enviar cambiosSubmit changes

El host de forma recepción-ventana en Service Manager proporciona botones para enviar los cambios realizados en el formulario y para cerrar el servicio pop de-una ventana.The form host pop-up window in Service Manager provides buttons for submitting changes that are made in the form and for closing the pop-up window.

Cuando un usuario hace clic en el aplicar botón de un formulario, la instancia de destino del formulario se envía para su almacenamiento.When a user clicks the Apply button for a form, the form's target instance is submitted for storage. Esta operación es sincrónica; por lo tanto, el usuario no puede editar el formulario hasta que la operación de envío no haya finalizado.This operation is synchronous; therefore, the user cannot edit the form until the submission operation is complete. Si se produce un error durante el envío del formulario, aparece un mensaje de error.If failure occurs during the form submission, an error message appears. El formulario permanece abierto para futuras modificaciones.The form remains open for further changes. Es recomendable que los usuarios apliquen sus cambios con frecuencia para evitar colisiones si se está editando otra instancia del formulario al mismo tiempo.We recommend that users apply their changes frequently to avoid collisions if another instance of the form is being edited at the same time.

Si el usuario hace clic en el botón Aceptar , el comportamiento es similar a Aplicar, excepto que, si la operación de envío del formulario se realiza satisfactoriamente, el formulario y su ventana host se cierran.If the user clicks the OK button, the behavior is similar to Apply, except that, if the form submission operation is successful, the form and its host window are closed.

Si el usuario hace clic en el botón Cancelar , aparece un cuadro diálogo que pide al usuario que confirme la operación.If the user clicks the Cancel button, a dialog box appears that asks the user to confirm the operation. El usuario puede hacer clic en y perder los cambios o hacer clic en No y volver al formulario.The user can click Yes and lose changes, or click No and return to the form.

Directrices generales y procedimientos recomendados para los formulariosGeneral guidelines and best practices for forms

Puede ampliar las características de Service Manager agregando o modificando formularios.You can extend features of Service Manager by adding or modifying forms. En este tema se describe algunas prácticas recomendadas para crear y utilizar formularios de Service Manager, mediante diversas herramientas y definiciones de formularios de scripting directamente.This topic describes some best practice recommendations for creating and using Service Manager forms, using various tools and scripting form definitions directly.

Este tema está dirigido principalmente a los asociados y clientes con experiencia en la creación de sus propios formularios personalizados mediante el uso de Windows Presentation Foundation (WPF) y Microsoft Visual Studio Team System o Microsoft Expression Blend.This topic is primarily targeted at partners and customers who are experienced in building their own custom forms by using Windows Presentation Foundation (WPF) and Microsoft Visual Studio Team System or Microsoft Expression Blend.

Las instrucciones generales para la creación de un nuevo formulario son las siguientes.The general guidelines for authoring a new form are as follows.

  • Utilizar controles estándar.Use standard controls.
  • Seguir las instrucciones generales de diseño de formularios.Follow general form design guidelines.
  • Evitar código-detrás.Avoid code-behind.
  • Incluir el control de excepciones.Include exception handling.
  • Tomar en consideración las actualizaciones y personalizaciones de formularios.Consider forms customization and upgrades.
  • Asignar un nombre a todos los controles personalizables.Name all customizable controls.
  • Enlazar el formulario a los orígenes de datos.Bind the form to data sources.
  • Use el Administrador de servicio formularios reglas de validación de infraestructura, los convertidores y plantillas de error.Use Service Manager forms infrastructure validation rules, value convertors, and error templates.
  • Utilizar los comandos y eventos de infraestructura de formularios.Use forms infrastructure commands and events.

Para obtener información acerca de estas instrucciones, consulte las secciones siguientes.For information about these guidelines, see the following sections.

Utilizar controles estándarUse standard controls

Entre los controles que se utilizan en un formulario se incluyen:Controls that are used on a form can be:

  • Controles estándar.Standard controls. Entre ellos se incluyen los controles de la biblioteca. NET, como el cuadro combinado y el cuadro de lista.This includes .NET library controls, such as combo box and list box.
  • Controles personalizados.Custom controls. Entre ellos se incluyen los controles adicionales creados por el autor del formulario o por un tercero.This includes additional controls that are created by the form author or by a third party.

Sugerencia

Si utiliza controles estándar siempre que es posible y evita la creación de controles personalizados, estará contribuyendo a la consistencia de la experiencia del usuario en relación con el uso de formularios.When you use standard controls wherever possible and avoid creating custom controls, you promote consistency with regard to the user experience of forms. Si tiene que crear un control personalizado, separe el comportamiento y la apariencia visual del comportamiento lógico mediante el uso de plantillas de control para definir la apariencia del control.If you must create a custom control, separate the visual appearance and behavior and the logical behavior by using control templates to define the appearance of the control. Preferiblemente, debería haber una plantilla de control independiente para cada tema de Windows.Preferably, there should be a separate control template for each Windows Theme.

Seguir las instrucciones de diseño de forma generalFollow general form design guidelines

Al diseñar un formulario, utilice instrucciones de diseño de acceso público para asegurarse de que el formulario es descriptivo y que se adhiere a usuario común-paradigmas de interacción.When you design a form, use public design guidelines to ensure that the form is user friendly and that it adheres to common user-interaction paradigms.

Para obtener más información acerca del diseño general de Windows, consulte Windows User Experience Interaction Guidelines (Instrucciones de interacción de Windows User Experience).For more information about general Windows design, see Windows User Experience Interaction Guidelines.

Además:In addition:

  • Divida la información entre varias pestañas para que el formulario sea más sencillo y fácil de leer.Divide information across multiple tabs to make the form simpler and easier to read. Incluya la información que utilice con mayor frecuencia en la primera pestaña y la información de menor importancia en las pestañas siguientes.Include the most commonly used information on the first tab and information of lesser importance on subsequent tabs.
  • Utilice los paneles de diseño para colocar controles en el formulario.Use layout panels to lay out controls on the form. De esta forma se asegurará de que el formulario se comporta correctamente cuando se localice o cambie de tamaño.This ensures that the form behaves correctly when it is resized and localized.
  • Evite establecer propiedades visuales de control individual y utilice estilos en su lugar.Avoid setting individual control visual properties, and use styles instead. De esta forma podrá cambiar la apariencia de todos los controles de una serie de formularios mediante la modificación del estilo y contribuir a la consistencia de la apariencia de los formularios relacionados.This makes it possible for you to change the appearance of all controls across a series of forms by modifying the style, and it promotes a consistent appearance across related forms.

Evitar el código subyacenteAvoid code-behind

Código-detrás de es un término que describe el código que se une con marcado-define objetos cuando una página XAML es compilado por marcado.Code-behind is a term that describes the code that is joined with markup-defined objects when an XAML page is markup compiled. Limitar el uso de código-subyacente en un formulario tanto como sea posible.Limit the use of code-behind in a form as much as possible. Es preferible incrustar el código para un formulario en el propio control, ya que posteriormente es más fácil cambiar el código.It is preferable that you embed the code for a form in the control itself, because later it is easier to change that code. En su lugar, utilice las capacidades declarativas compatibles con la infraestructura de formularios de Service Manager para definir conversiones de valores y reglas de validación en el formulario.Instead, use the declarative capabilities that are supported by the Service Manager forms infrastructure to define value conversions and validation rules in the form.

Como norma general, debería limitar el uso de código-subyacente para situaciones en las que no es posible proporcionar la funcionalidad necesaria mediante el uso de las capacidades declarativas de XAML, con las clases definidas en WPF y en la biblioteca de infraestructura de formularios.As a general guideline, you should limit the use of code-behind to situations in which it is not possible to provide the required functionality by using the declarative capabilities of XAML, with classes defined in the WPF and the forms infrastructure library. Aún así, considere la posibilidad de mover la funcionalidad que se implementa en código-subyacente a una biblioteca auxiliar y, a continuación, hacer referencia a ella desde XAML.Even then, consider moving the functionality that is implemented in code-behind into a helper library, and then reference it from the XAML.

Incluir el control de excepcionesInclude exception handling

Asegúrese de que el código del formulario contiene control de excepciones para que se puede cargar el formulario tanto durante la fase de diseño en la herramienta de creación y en la consola de administrador de servicios en tiempo de ejecución.Ensure that the code in the form contains exception handling so that the form can be loaded both during the design phase in the Authoring Tool and in the Service Manager console at run time.

Tenga en cuenta las actualizaciones y personalizaciones de formulariosConsider forms customization and upgrades

A la hora de diseñar un nuevo formulario, debe tomar en consideración las futuras personalizaciones y actualizaciones del mismo.When you are designing a new form, you should consider future customizations and upgrades to that form. Para asegurarse de que puede personalizar y actualizar un formulario, a la vez que mantiene las personalizaciones, siga las instrucciones y las sugerencias indicadas anteriormente en esta sección, así como las siguientes instrucciones:To ensure that it is possible to customize and to upgrade a form while preserving customizations, follow the guidelines and tips that are provided previously in this section, along with the following guidelines:

  • Tenga en cuenta las actualizaciones y personalizaciones futuras anticipadamente mientras diseña el formulario.Consider future customizations and upgrades early while you are designing the form. Los formularios son susceptibles de evolucionar en versiones futuras y es importante tomar en consideración la forma en que los usuarios puedan actualizarlos a nuevas versiones a la vez que mantienen sus personalizaciones en el formulario original.Forms are likely to evolve in future versions, and it is important to consider how users will be able to upgrade to new versions of your form while preserving their customizations to the original form. Por ejemplo, podría proporcionar un formulario actualizado después de que los usuarios hayan hecho un gran esfuerzo en la personalización del formulario original.For example, you might provide an updated form after users have already invested heavily in customizing your original form. Los usuarios esperan que sus personalizaciones sobrevivan a la actualización de versión.Users expect their customizations to survive the version upgrade.

  • Asigne un nombre único a cada control del formulario para que las personalizaciones se puedan aplicar a los controles.Provide a unique name for each control on the form to make it possible for customizations to be applied to controls. Las personalizaciones de formularios se almacenan como un conjunto de acciones destinadas a un control específico o a un conjunto de controles.Form customizations are stored as a set of actions that are targeted at a specific control or a set of controls. Se hace referencia al control de destino por su nombre, motivo por el cual es importante mantener los nombres de los controles en las distintas versiones del formulario.The target control is referenced by name, which is why it is important to preserve control names across versions of the form. Si un control no tiene nombre, el Editor de la personalización de formularios genera un nombre, pero éste no se conserva en las distintas versiones del formulario.If a control does not have a name, the Form Customization Editor generates a name, but the generated name is not preserved across different versions of the form.

  • Asegúrese de que los nombres de los controles permanecen inmutables en las distintas versiones del formulario.Ensure that control names remain immutable across different versions of the form. De esta forma se garantiza que las personalizaciones de un control determinado en una versión anterior se pueden aplicar al mismo control en una nueva versión del formulario.This ensures that customizations for a given control in a previous version can be applied to the same control in a new version of the form.

  • Si es posible, evite mover controles a una ubicación diferente en la misma pestaña cuando actualice un formulario.If possible, avoid moving controls to a different location on the same tab when you upgrade a form. Una personalización común de usuario desplaza los controles del formulario a una ubicación diferente.A common user customization is moving controls on the form to a different location. Si se cambia la ubicación de un control en una nueva versión del formulario, se corre el riesgo de que la nueva ubicación del control se superponga con un control que el usuario haya reubicado.If you change the location of a control in a new version of the form, there is a risk that the new control location could overlap with a control that the user has relocated.

  • Si es posible, evite mover controles entre las pestañas cuando diseñe una actualización de un formulario existente.If possible, avoid moving controls between tabs when you are designing an update to an existing form. Los controles se identifican por el nombre y por la pestaña en la que están ubicados.Controls are identified both by name and by the tab on which they are located. Si mueve un control de una pestaña a otra en una nueva versión del formulario puede interrumpir las personalizaciones que el usuario haga en dicho control, ya que en las personalizaciones se producirá un error de identificación del control de destino.Moving a control from one tab to another in a new version of the form can break customizations that the user makes to that control, because the customizations will fail to identify the target control.

  • Si la actualización de un formulario incluye nuevos controles, considere la posibilidad de agregar los nuevos controles a una ficha pestaña.When the update to a form includes new controls, consider adding the new controls to a new tab. Esta es la forma más segura de evitar la interferencia entre las personalizaciones del usuario y los controles y las pestañas existentes.That is the safest way to avoid interfering with any user customizations to the existing tabs and controls.

  • Tenga en cuenta cómo se enlazan los controles.Be aware of how controls are bound. Lectura-solo los controles deben utilizar solo una-enlaces de forma.Read-only controls should use only one-way bindings.

El nombre de todos los controles personalizablesName all customizable controls

Asegúrese de que los nombres de los controles describen los datos a los que está enlazados o lo que dichos controles hacen.Ensure that the control names describe what data the control is bound to, or describe what the control does.

Enlazar el formulario a orígenes de datosBind the form to data sources

El propósito principal de un formulario es visualizar un objeto único de la base de datos de Service Manager.The main purpose of a form is to visualize a single object from the Service Manager database. Este objeto se denomina un instancia de destino, siempre que se especifica mediante la DataContext propiedad de un formulario (que se hereda de la FrameworkElement clase).This object is called a target instance, which is always specified by the DataContext property of a form (which is inherited from the FrameworkElement class).

Importante

No modifique el formulario DataContext propiedad.Do not modify the form's DataContext property. El entorno de hospedaje de los formularios utiliza esta propiedad para identificar la instancia de destino del formulario.The forms hosting environment uses this property to identify the form target instance.

En el modelo de datos de Service Manager, una instancia de destino se representa como un BindableDataItem objeto.In the Service Manager data model, a target instance is represented as a BindableDataItem object. Esta clase agrega el kit de desarrollo de software subyacente (SDK) objeto y lo expone sus propiedades a través de un indizador, que toma un nombre de propiedad como un parámetro.This class aggregates the underlying software development kit (SDK) object, and it exposes its properties through an indexer, which takes a property name as a parameter.

La clase BindableDataItem también implementa ICustomTypeDescriptor, lo que hace posible el uso de la clase BindableDataItem como origen de datos para el enlace de WPF.The BindableDataItem class also implements ICustomTypeDescriptor, which makes it possible to use the BindableDataItem class as a data source for WPF binding. El siguiente es un ejemplo de enlace de una propiedad de instancia de destino a la propiedad Text de un control TextBox :The following is an example of binding a target instance property to the Text property of a TextBox control:


<TextBox Name="textBoxDescription" Text="{Binding Path=Summary}"/>

No es necesario especificar el Source del enlace, ya que las instancias de destino se establecen como el DataContext del formulario, lo que sirve de Source predeterminado para todos los controles del formulario.It is not necessary to specify the Source of the binding because the target instances are set as the DataContext of the form, which serves as the default Source for all controls on the form.

Los controles del formulario se pueden enlazar a orígenes de datos distintos de la instancia de destino y la biblioteca de infraestructura de formularios contiene una serie de controles que realizan el enlace de forma implícita.Controls on the form can be bound to data sources other than the target instance, and the forms infrastructure library contains a number of controls that perform the binding implicitly. Por ejemplo, el control del selector de instancia está enlazado al origen de datos, lo que proporciona la recopilación de instancias para elegir.For example, the instance picker control is bound to the data source, which provides the collection of instances to choose. También es posible definir orígenes de datos adicionales mediante declaración con las clases ObjectDataProvider y XmlDataProvider .It is also possible to define additional data sources declaratively using the ObjectDataProvider and XmlDataProvider classes.

La infraestructura de formularios considera la instancia de destino como de solo lectura/escribir el origen de datos en el formulario.The forms infrastructure considers the target instance as the only read/write data source on the form. Por lo tanto, la implementación del comando Submit solo guardará los cambios realizados en la instancia de destino.Therefore, the implementation of the Submit command will only store the changes that are made to the target instance. El resto de los orígenes de datos para el formulario se tratan como de solo lectura.Other data sources for the form are treated as read only.

Use el Administrador de servicio de validación de infraestructura de formularios reglas, convertidores y plantillas de errorUse Service Manager forms infrastructure validation Rules, value convertors, and error templates

Es recomendable utilizar reglas de validación de infraestructura de formularios en los formularios para designar las entradas de datos no válidas.We recommend that you use forms infrastructure validation rules in forms to designate data input that is not valid. La infraestructura de enlace de WPF admite la validación de propiedades del control que están enlazados a un origen de datos con una-manera o dos-enlaces de forma.The WPF binding infrastructure supports validation for control properties that are bound to a data source with either one-way or two-way bindings. El objeto de enlace tiene una colección ValidationRules que puede contener cualquier número de objetos ValidationRule .The binding object has a ValidationRules collection that can contain any number of ValidationRule objects. Cada vez que los datos se insertan desde el control al origen de datos, se llama a los objetos ValidationRule para validar el valor.Whenever data is pushed from the control to the data source, the ValidationRule objects are called to validate the value.

La biblioteca de infraestructura de formularios contiene una serie de reglas de validación que controlan los casos más comunes.The forms infrastructure library contains a number of validation rules that handle the most common cases. La infraestructura de formularios aprovecha las ventajas de las reglas de validación para determinar si el contenido de los formularios se puede enviar para almacenar.The forms infrastructure takes advantage of the validation rules to determine whether the form contents can be submitted for storing. Por ejemplo, un formulario enviar botón puede deshabilitarse si no hay un control que tiene un error de validación en el formulario.For example, a form's Submit button can be disabled if there is a control that has a validation error on the form.

Es recomendable utilizar la plantilla personalizada de errores que se proporciona con la biblioteca de infraestructura de formularios.We recommend that you use the custom error template that is provided with the forms infrastructure library. Si un control tiene un error de validación, aparece de forma predeterminada con un borde rojo alrededor del mismo.If a control has a validation error, it appears by default with a red border around it. WPF permite definir un indicador personalizado de errores mediante la propiedad Validation.ErrorTemplate , que se puede establecer en cualquier control.The WPF makes it possible to define a custom error indicator through the Validation.ErrorTemplate property, which can be set on any control. La biblioteca de infraestructura de formularios de Service Manager contiene una plantilla personalizada de errores, que muestra un icono de error en lugar del borde de color rojo de WPF.The Service Manager forms infrastructure library contains a custom error template, which displays an error icon instead of the WPF red border. Además, al señalar el icono de error con el mouse, aparece una información sobre herramientas con un mensaje de error.In addition, when a mouse points to the error icon, a tooltip pops up with an error message. El mensaje de error debe indicar el motivo por el cual no se han podido validar los datos en el control.The error message should indicate the reason why the data in the control failed validation.

En el ejemplo siguiente se muestra cómo hacer referencia a la plantilla de errores en XAML:The following example shows how to reference the error template in XAML:


<TextBox Text="{Binding SomeProperty}"
         scwpf:Validation.ValueRequired="True"
         Validation.ErrorTemplate="{DynamicResource {ComponentResourceKey {x:Type scwpf:Validation}, InvalidDataErrorTemplate}}"/>

Si compila-en la validación de reglas no proporcionan la lógica de validación necesaria, se recomienda crear reglas de validación personalizada para representar dicha lógica.If built-in validation rules do not provide the required validation logic, we recommend that you build custom validation rules to represent that logic. De esta forma, las lógicas de validación estándar y personalizada pueden coexistir en el mecanismo común de control de validaciones.This will make it possible for standard and custom validation logic to coexist within the common validation handling mechanism.

Si el mecanismo de reglas de validación no es adecuado para un escenario concreto, en su lugar, controle FormEvents.PreviewSubmitEvent y ejecute la validación desde ahí.If the validation rules mechanism is not adequate for a particular scenario, you should instead handle FormEvents.PreviewSubmitEvent and run the validation from there.

El siguiente código de muestra proporciona un ejemplo del patrón que puede utilizar para ejecutar la validación personalizada:The following code example provides an example of the pattern that you can use to run custom validation:


void MyForm_Loaded(object sender, RoutedEventArgs e)
{
    // hook to handle form events
    this.AddHandler(
        FormEvents.PreviewSubmitEvent,
        new EventHandler<PreviewFormCommandEventArgs>(this.OnPreviewSubmit));
}
private void OnPreviewSubmit(object sender, PreviewFormCommandEventArgs e)
{
    string errorMessage;
    bool result = this.DoVerify(out errorMessage);
    if (!result)
    {
        // cancel Submit operation
        e.Cancel = true;
        // display error message
        MessageBox.Show(errorMessage);
    }
}
internal bool DoVerify(out string errorMessage)
{
    // Do custom verification and return true to indicate that
    // validation check has passed; otherwise return false and
    // populate errorMessage argument
}

Utilizar los comandos de la infraestructura de formularios y eventosUse form infrastructure commands and events

La infraestructura de formularios expone una serie de comandos que se pueden ejecutar en un formulario.The form infrastructure exposes a number of commands that can be run on a form. Entre estos comandos se incluyen:These commands include:

  • FormsCommand.Submit, que guarda la instancia de destino del formulario.FormsCommand.Submit, which saves the target instance of the form.

  • FormsCommand.SubmitAndClose, que guarda la instancia de destino del formulario y cierra el formulario.FormsCommand.SubmitAndClose, which saves the target instance of the form and closes the form.

  • FormsCommand.Refresh, que repite la consulta para la instancia de destino del formulario.FormsCommand.Refresh, which repeats the query for the target instance of the form.

  • FormCommands.Cancel, que descarta todos los cambios y cierra el formulario.FormCommands.Cancel, which discards all changes and closes the form.

    Los eventos, que se producen antes y después de la ejecución de los comandos, muestran cada comando entre corchetes.Each of these commands is bracketed by events, which are raised before and after the command runs.

    Antes del comando se producen los eventos siguientes:Before the command, the following events are raised:

  • El evento FormEvents.PreviewSubmit se produce antes del comando FormCommand.Submit y el evento FormEvents.Submitted se produce después del comando FormCommand.Submit .The FormEvents.PreviewSubmit event is raised before the FormCommand.Submit command, and the FormEvents.Submitted event is raised after the FormCommand.Submit command.

  • El evento FormEvents.PreviewRefresh se produce antes del comando FormCommands.Refresh y el comando FormCommand.Refreshed se produce después del comando FormCommand.Submit .The FormEvents.PreviewRefresh event is raised before the FormCommands.Refresh command, and the FormCommand.Refreshed command is raised after the FormCommand.Submit command.

  • El evento FormEvents.PreviewCancel se produce antes del comando FormCommands.Cancel y el evento FormCommand.Canceled se produce después del comando FormCommand.Cancel .The FormEvents.PreviewCancel event is raised before the FormCommands.Cancel command, and the FormCommand.Canceled event is raised after the FormCommand.Cancel command.

La vista preliminar de los eventos pasa un objeto PreviewFormCommandEventArgs .The preview events pass along a PreviewFormCommandEventArgs object. Este objeto contiene una propiedad Cancel mutable, que impedirá la ejecución del comando correspondiente si la propiedad está establecida en true.This object contains a mutable Cancel property that will prevent the corresponding command from running when the property is set to true.

La entrada de blog-comando eventos pasa un FormCommandExecutedEventArgs objeto.The post-command events pass a FormCommandExecutedEventArgs object. Este objeto contiene una propiedad Result , que indica si la ejecución del comando se ha realizado con éxito, se ha cancelado o ha producido un error.This object contains a Result property that indicates whether the running of the command succeeded, was canceled, or caused an error. En caso de error, la propiedad Error del objeto FormCommandExecutedEventArgs hace referencia a la excepción que proporciona información sobre el error.In case of an error, the Error property of the FormCommandExecutedEventArgs object references the exception that provides information about the error.

Los comandos de los formularios se pueden habilitar, deshabilitar y ejecutar mediante programación o mediante declaración.It is possible to enable, disable, and run form commands both programmatically and declaratively.

Para habilitar comandos de formulario mediante programación, establezca un CommandBinding entre el formulario y el comando relacionado.To enable form commands programmatically, establish a CommandBinding between the form and the related command.

En el siguiente ejemplo, se establece un enlace de comando entre el formulario y un comando Refresh y se definen dos controladores para este comando.In the following example, a command binding is established between the form and a Refresh command, and two handlers are defined for this command. El primer controlador indica si el comando Refresh se puede ejecutar o no y el segundo controlador contiene la implementación del comando Refresh :The first handler returns whether or not the Refresh command can run, and the second handler actually contains the implementation of the Refresh command:


    public class MyForm : UserControl
    {
        public MyForm()
        {
            // do standard initialization
            // establish CommandBinding for Refresh command
            this.CommandBindings.Add(
                new CommandBinding(FormCommands.Refresh, this.ExecuteRefresh, this.CanExecuteRefresh));
        }
        private void CanExecuteRefresh(
              object sender,
              CanExecuteRoutedEventArgs e)
        {
            // put your logic that determines whether Refresh
// can be executed here
            bool canExecute = true;
            BindableDataItem dataItem = this.DataContext as BindableDataItem;
            if (dataItem)
            {
                canExecute = dataItem["Status"] != "New";
            }
            e.CanExecute = canExecute;
        }
        private void ExecuteRefresh(
            object sender,
            ExecutedRoutedEventArgs e)
        {
            // here is placeholder for the code that has do be
// executed upon running Refresh command
        }
    }

También puede definir controladores para comandos de formulario mediante declaración.You can also define handlers for form commands declaratively. Para ello, utilice un objeto Regla que usa un RoutedCommandTrigger.You can do this by employing a Rule object that uses a RoutedCommandTrigger. En el ejemplo de código siguiente se muestra cómo definir controladores mediante declaración:The following code example shows how to define handlers declaratively:


    <scwpf:BusinessLogic.Rules>
        <scwpf:RuleCollection>
            <scwpf:Rule>
                <scwpf:Rule.Triggers>
                    <scwpf:RoutedCommandTrigger
RoutedCommand="{x:Static scwpf:FormCommands.Refresh}"/>
                </scwpf:Rule.Triggers>
                <scwpf:Rule.Conditions>
                    <scwpf:PropertyMatchCondition
                        Binding="{Binding Status}"
                        Value="New"
                        Operation="NotEquals" />
                </scwpf:Rule.Conditions>
                <!-- Use RuleAction objects to define the logic that executed
                upon running Refresh command; this can be left empty -->
            </scwpf:Rule>
        </scwpf:RuleCollection>
    </scwpf:BusinessLogic.Rules>

Pasos siguientesNext steps