2009-03-11 8 views

Respuesta

3

No, la especificación actual no tiene un tipado fuerte en Xaml. Creo que con .Net 4.0, Xaml debería estar viendo la capacidad de los genéricos. Con eso, creo que debería ser mucho más fácil tener un tipeo fuerte en Xaml.

3

Se puede escribir la unión de cada individuo de una manera inflexible de tipos:

<TextBox Text="{Binding Path=(vm:Site.Contact).(vm:Contact.Name)}" /> 

Sin embargo esto no sería validar el hecho de que TextBox DataContext es de tipo ViewModel.Site (y creo que esto no es posible, pero Puedo estar equivocado).

0

Prueba esto:

<Window> 
    <Window.Resources> 
     <DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}"> 
      ... 
     </DataTemplate> 
    </Window.Resources> 

    <ContentPresenter Content="{Binding}" Template="{StaticResource TypedTemplate}" /> 
</Window> 

no he probado este código, pero hay que darle la idea. El presentador de contenido mostrará el DataContext actual que usará DataTemplate. Esto no está fuertemente tipado en el compilador, pero arrojará un error de tiempo de ejecución inmediatamente en la carga (en el InitializeComponent de la ventana). Debería ser capaz de detectar esto fácilmente en sus pruebas si algo se rompe.

+0

.Net 3.5 no tiene un DataTemplate.Propiedad TargetType –

+0

@Brian Tienes razón, es DataType. Dije que no había sido probado. Actualicé la respuesta para arreglar el error. –

2

FrameworkElement.DatatContext es la propiedad de dependencia que habilita el enlace de datos del tipo object.

Como han señalado otros, puede especificar el tipo esperado de DataContext para una plantilla especial llamada DataTemplate. Muchos controles como ItemsControl, ControlControl proporcionan acceso a DataTemplates para permitirle establecer las expectativas de la representación visual del tipo de DataContext.

Bryan tiene razón, no ha probado su código.

La correcta aplicación de un DataTemplate escrito tiene el siguiente aspecto:

<Window> 
    <Window.Resources> 
     <DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}"> 
     ... 
     </DataTemplate> 
    </Window.Resources> 
    <ContentControl Content="{Binding}" ContentTemplate="{StaticResource TypedTemplate}" /> 
</Window> 

ContentPresenter hereda directamente de FrameworkElement y no tiene una propiedad de plantilla. Además, la propiedad de Plantilla comúnmente se refiere a Control.Template de tipo ControlTemplate, que es algo completamente diferente a una DataTemplate.

Creo que Bryan estaba pensando en el ContentControl que es uno de los dos tipos de control de raíz (el otro es ItemsControl). ContentControl hereda de Control. Por lo tanto, podemos especificar la propiedad de la Plantilla si así lo elegimos.

<Window> 
    <Window.Resources> 
     <DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}"> 
     ... 
     </DataTemplate> 
     <ControlTemplate x:Key="ControlSkin" TargetType="{x:Type ContentControl}"> 
     ... 
     </ControlTemplate> 
    </Window.Resources> 
    <ContentControl Content="{Binding}" ContentTemplate="{StaticResource TypedTemplate}" Template="{StaticResource ControlSkin}" /> 
</Window> 
1

personalmente me declaro un PropertyPath estática para cada propiedad en mi modelo de vista la referencia esta usando X: estática como la ruta de enlace - por ejemplo

public class MyViewModel 
{ 
    public static PropertyPath MyPropertyPath = new PropertyPath("MyProperty"); 
    public bool MyProperty{get; set;} 
} 

xaml: {Binding Path={x:Static local:MyViewModel.MyPropertyPath}}

De esta manera todos mis enlaces se validan en la compilación.

Cuestiones relacionadas