2009-08-19 10 views
12

Estaba trabajando con el control ComboBox y no pude establecer el SelectedItem desde la propiedad en mi viewmodel. Aquí está la definición del control:Silverlight XAML Definición de atributo Asunto

<ComboBox x:Name="jobEmployee" Grid.Column="1" Grid.Row="2" 
    Margin="4" HorizontalAlignment="Left" Width="150" 
    SelectedItem="{Binding Path=EditingJob.Employee, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" 
    ItemsSource="{Binding Path=Employees, Mode=OneWay}" 
    DisplayMemberPath="FullName"/> 

tuve otro control ComboBox que funcionó bien sobresalen. La diferencia entre uno que establecería SelectedItem y el que no lo haría era el orden de la definición del atributo. Aquí está la definición de control de trabajo:

<ComboBox x:Name="jobEmployee" Grid.Column="1" Grid.Row="2" 
    Margin="4" HorizontalAlignment="Left" Width="150" 
    ItemsSource="{Binding Path=Employees, Mode=OneWay}" 
    SelectedItem="{Binding Path=EditingJob.Employee, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" 
    DisplayMemberPath="FullName"/> 

La diferencia entre el 2 es que la ItemsSource se define antes de la SelectedItem por un trabajo que me lleva a creer que en este caso al menos, las cuestiones de orden definición de atributos. ¿Me estoy perdiendo algo o he encontrado que esto es cierto? ¿Ha sido documentado en alguna parte?

Respuesta

15

Sí la orden puede importar. Considere que la lectura XAML implica la creación de objetos y la asignación de valores a las propiedades de estos objetos. No es posible asignar valores de propiedades al mismo tiempo, claramente se asignará una propiedad seguida de otra y luego otra hasta que se asignen todas las propiedades.

Dado que la asignación de propiedades en algunos objetos da como resultado efectos secundarios y otro código en ejecución, el orden de asignación de esas propiedades puede afectar el resultado. Esto, por supuesto, es algo malo.

+0

En este caso, tiene sentido que un elemento en una lista no se pueda seleccionar si la lista no existe en primer lugar. Esta es una peculiaridad a tener en cuenta al codificar Silverlight XAML. ¿Quizás herramientas como Expression Blend se aseguren de que los atributos estén definidos en el orden correcto? – DaveB

+0

@DaveB: No estoy seguro de que así sea, tendría que probar este escenario yo mismo. En mi uso típico, hasta ahora el contexto de datos se asigna a algún antecesor más tarde que cualquiera de las dos propiedades, en cuyo caso no debería importar en qué orden se asignan estas propiedades. – AnthonyWJones

+0

Las directrices dicen que no debería importar: "DO permite que las propiedades se establezcan en cualquier orden, incluso si esto da como resultado un estado inválido temporal del objeto." https://msdn.microsoft.com/en-us/library/ms229006%28v=vs.110%29.aspx?f = 255 & MSPPError = -2147217396 – Wouter

2

La próxima vez que tenga un problema similar a este y sospeche que el enlace podría estar fallando debido a la orden. Compruebe su ventana de salida, muestra todos los errores vinculantes, por lo que de ese error podría deducirse que ItemSource era nulo en el momento de enlazar la propiedad SelectedItem

+0

Este es un punto excelente. Ni siquiera pensé en mirar hacia allí. – DaveB

5

En cualquier circunstancia en la que el orden de las propiedades sea importante, se debe utilizar la sintaxis de elementos, no atribuir la sintaxis, para representar esas propiedades en su XAML:

<ComboBox x:Name="jobEmployee" Grid.Column="1" Grid.Row="2" 
    Margin="4" HorizontalAlignment="Left" Width="150" DisplayMemberPath="FullName"> 
    <ComboBox.ItemsSource> 
     <Binding Path="Employees" Mode="OneWay"/> 
    <ComboBox.ItemsSource> 
    <ComboBox.SelectedItem> 
     <Binding Path="EditingJob.Employee" Mode="TwoWay" 
     ValidatesOnExceptions="true" NotifyOnValidationError="true"/> 
    </ComboBox.SelectedItem> 
</ComboBox> 

de acuerdo con la recomendación XML, el orden de los atributos de un elemento no es significativo. No es necesario que las herramientas XML conserven el orden en que aparecen. Por lo tanto, si procesó este elemento ComboBox con una transformación XSLT (no es una idea loca en algunas circunstancias), la transformación podría cambiar el orden de sus atributos, incluso si está haciendo <xsl:copy-of>. El procesador XSLT probablemente no hará esto, pero no es necesario no a.

¿Qué efecto tendría la aleatorización del orden de los atributos en cada elemento de su XAML en el comportamiento de su aplicación? La respuesta a esa pregunta debería ser "nada".

Este es un aspecto de XAML que me pone muy nervioso.

Cuestiones relacionadas