Manera correcta de basar un estilo en el estilo por defecto

<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
Anuncios

MenuItems en WPF con textos y Bindings

Amigo fiero que te chutas DataTemplates por las noches, recuerda esto. Si tienes un MenuItem cuyo Header quieres que tenga un texto con un Binding y un Converter, no te olvides de lo siguiente:

Si pones Header=”{Binding bla bla bla, Converter = blo blo blo}” la cosa no te va a funcionar por mucho que ruegues a Dios que funcione.

Header es de tipo object, y va a renderizar el Binding como cadena y punto pelota. Finalmente saldrá un TextBlock guarrero que no tiene binding ni tiene NA.

Así es es como te va a funcionar

<MenuItem>

   <MenuItem.Header>

        <TextBlock Text=”{Binding bla blabla}” />

   </MenuItem.Header>

</MenuItem>

Do you understand, brothermoya? Ahora sí, ¡Ecuador!

La teoría de los Managers

La enuncia un tal “Suppa JMN” y dice tal que así:

La calidad del código de un proyecto es proporcional al número total de líneas e inversamente proporcional al producto del cuadrado de la media de líneas de código neto por el número de Managers*.

Capture

Donde:

  • N es el número total de líneas netas del proyecto
  • M es el número de Managers.
  • c es el número de líneas netas de código de una clase.

Valga la siguiente tabla como orientación:

  • > 10. Código de calidad extrema. ¡Felicidades!
  • 2 – 10. Código de buena madre.
  • 1 – 2. Código pasable.
  • 0,5 – 1. Código de mediocre
  • 0,1 – 0,5. Putruño.
  • < 0,1. Una mierda como un piano. Préndele fuego al repositorio.

* Clases cuyos nombre tienen el sufijo “Manager”

Un ComboBox con los elementos formateados que lo flipas

EDITADO: Lo de tener un combo editable con sufijos es un temario en el que no he tenido huevos para sacarlo. La pregunta en StackOverflow  aquí.

<ComboBox
                        IsEditable="True"
                        Width="70"
                        ItemsSource="{StaticResource ZoomValues}"
                        ItemStringFormat="{}{0:0.## %}"
                        Text="{Binding ActiveEditor.ZoomFactor, ElementName=Root, Converter={StaticResource PercentageConverter}, StringFormat={}{0:0.## %}}" />

Attention al Binding y al ItemStringFormat. Tócate la pera, chaval. ¡Cómo no se te va a olvidar esto?

ICollection<T> vs IEnumerable<T> vs IList<T>

Por si las dudas, hermoso.

IEnumerable, ICollection, and IList (generally, any type with an I prefix) are just interfaces. They let you expose what your class will do, but unlike if you inherit a class, interfaces do not provide you a default implementation of any of the things they say you must do.

As far as choosing which interface, here’s a quick guide:
An IList is an ICollection that can be accessed by index.
An ICollection is an IEnumerable with easy access to things like Add, Remove, and Count.
An IEnumerable is anything that can be enumerated, even if the list of those things doesn’t exist until you enumerate it.

Some classes that you might want to extend (or keep as a private field that runs most of the logic) for your collection are List<T>, Collection<T>, (which implements IList<T>, but with easier access to overriding implementation, see Collection<T> versus List<T> what should you use on your interfaces? for the big differences between these two) ObservableCollection<T>, or collections that are not lists, like Dictionary<T, U> and HashSet<T>. For more info on any of these, look up the MSDN documentation on the class.

Pon guapo tu XAML con namespaces

En tus ensamblados:

Para definir un espacio de nombres:

[assembly: XmlnsDefinition("http://www.sample.com/schemas/wpf/project/namespace", "UI")]

Para definir el prefijo al que asociar los espacios de nombres del ensamblado:

[assembly: XmlnsPrefix("http://www.sample.com/schemas/wpf/project/namespace", "myprefix")]

Y así es como se mezclan los espacios de nombres en un mismo prefijo ;D