2009-07-04 12 views
50

Al usar WPF noté que cuando agrego un control a un archivo XAML, se llama al constructor predeterminado.Llamar a un constructor parametrizado de XAML

¿Hay alguna manera de llamar a un constructor parametrizado?

+0

Mire mi pregunta http://stackoverflow.com/questions/15735830/wpf-best-practice-of-registering-a-delegatecommand-to-a-compositecommand –

Respuesta

11

No. No es de XAML [cuando se usa WPF].

66

.NET 4.0 trae una nueva característica que desafía la respuesta.

x:Arguments Directive

<object ...> 
    <x:Arguments> 
     oneOrMoreObjectElements 
    </x:Arguments> 
</object> 
+0

Bien, me alegra que traído esto arriba. –

+1

Otra publicación en http://www.wpftutorial.net/XAML2009.html –

+23

Para cualquier otra persona que haya venido buscando exactamente esta respuesta, le ahorraré algo de tiempo porque está a punto de encontrar esta publicación a continuación: http: //stackoverflow.com/questions/14347181/how-to-fix-xaml2009-language-construct-is-not-allowed-here – Kevek

21

Soy consciente de que estoy tarde a la fiesta aquí, pero ya que nadie se dirigió a las convenciones de WPF, pensé que interrumpiría.

Uno de los principios rectores de Los objetos compatibles con XAML son que deben ser completamente utilizables con un constructor predeterminado, es decir, no hay ningún comportamiento al que solo se pueda acceder cuando se utiliza un constructor no predeterminado. Para adaptarse a la naturaleza declarativa de XAML, los parámetros del objeto se especifican a través de los establecedores de propiedades. También hay una convención que dice que el orden en que las propiedades se establecen en XAML no debería ser importante.

Es posible, sin embargo, tienen algunas consideraciones especiales que son importantes para su aplicación, pero en desacuerdo con la convención:

  1. Usted puede tener una o más propiedades que debe ajustarse antes el objeto se puede utilizar .
  2. Dos o más propiedades pueden ser mutuamente excluyentes entre sí, por ejemplo, no tiene sentido establecer StreamSource y UriSource de una imagen.
  3. Es posible que desee asegurarse de que una propiedad es solo establecida durante la inicialización.
  4. Una propiedad puede depender de otra, lo que puede ser complicado debido a la convención antes mencionada de independencia de la orden al establecer propiedades.

Para facilitar el manejo de estos casos, se proporciona la interfaz ISupportInitialize. Cuando un objeto se lee y se crea a partir de XAML (es decir, analizar), objetos de aplicación ISupportInitialize serán manejados de forma especial:

  1. El constructor por defecto será llamado.
  2. BeginInit() se llamará.
  3. Las propiedades se establecerán en el orden en que aparecieron en la declaración XAML.
  4. EndInit() se llama.

Por llamadas de seguimiento a BeginInit() y EndInit(), puede manejar cualquier cosa que las reglas que necesita imponer, incluyendo el requisito de que ciertas propiedades pueden establecer. Así es como debe manejar los parámetros de creación; no requiriendo argumentos de constructor

También se proporciona ISupportInitializeNotification, que extiende la interfaz anterior al agregar una propiedad IsInitialized y el evento Initialized. Recomiendo usar la versión extendida.

0

Sí, puede hacerlo por el ObjectDataProvider. Se le permite llamar constructor no predeterminado, por ejemplo:

<Grid> 
    <Grid.Resources> 
     <ObjectDataProvider x:Key="myDataSource" 
          ObjectType="{x:Type local:Person}"> 
      <ObjectDataProvider.ConstructorParameters> 
       <system:String>Joe</system:String> 
      </ObjectDataProvider.ConstructorParameters> 
     </ObjectDataProvider> 
    </Grid.Resources> 
    <Label Content="{Binding Source={StaticResource myDataSource}, Path=Name}"></Label> 
</Grid> 

el supuesto de que la persona es

public class Person 
{ 
    public Person(string Name) 
    { 
     this.Name = Name; 
    } 
    public string Name { get; set; } 
} 

Lamentablemente no se puede obligar a la ConstructorParameters. Vea alguna solución provisional here.

Cuestiones relacionadas