2011-11-23 12 views
6

No copiaré/pegaré todo mi archivo xaml. Será muy largo de explicar, pero aquí es lo que es interesante: Tengo una unión de un "Nombre" PropiedadEnlazando a una segunda propiedad si la primera es "indefinida"

<TextBlock Text="{Binding Name}"/> 

Lo que pasa es que a veces, mi artículo no tiene una propiedad "Nombre". No se cuelga pero simplemente tengo un Texto vacío en mi TextBlock

Lo que yo haría, si el nombre está vacío, se vinculará a "nada", solo {Binding}. ¡Esto mostrará mi nombre de objeto y será perfecto!

Gracias de antemano por cualquier ayuda, y lo siento si se trata noobie :(

Respuesta

6

Lo que se quiere aquí es un PriorityBinding.

En particular, se vería algo así como (sintaxis exacta puede necesitar algún tipo de verificación):

  <TextBlock> 
      <TextBlock.Text> 
       <PriorityBinding> 
        <Binding Path="Name"/> 
        <Binding /> 
       </PriorityBinding> 
      </TextBlock.Text> 
     </TextBlock> 

Tenga en cuenta que esto cae específicamente hacia atrás cuando la propiedad Name no está disponible en el objeto de ser de éste; si la propiedad Name tiene un valor de cadena vacío, creo que seguirá usando ese valor vacío.

+0

no se acepta pero nuestra solución suena estupendo ! –

+0

Probar:

+1

@Guillaume, Dylan editó para mostrar la sintaxis completa; en general, '' es la sintaxis XAML para establecer el valor de una propiedad con una construcción más compleja, en lugar de un valor en línea. La extensión de marcado '{Binding ...}' es solo un atajo para crear estas instancias de clase 'Binding'. El compilador XAML luego hace magia adicional de casos especiales para darse cuenta de que Text es una DependencyProperty, por lo que permite que el valor se 'establezca' en un enlace, que maneja llamando a las diversas funciones de BindingOperations necesarias para cablear las cosas. –

0

Si usted no tiene para enlazar con el nombre de tipo objeto que podría utilizar TargetNullValue que le dará un valor predeterminado si la propiedad con destino es nulo, así:

<TextBlock Text="{Binding Name, TargetNullValue=Default}" /> 

Si realmente desea que el nombre del tipo de objeto que sugeriría escribir un convertidor (aplicar IValueConverter) Quiero saber si quieres un convertidor muestra

+0

Con su código, todavía tengo TextBlocks vacíos cuando mis objetos no tienen ninguna propiedad de Nombre. No sé si fue intencionado o no. Sobre el convertidor, realmente no lo sé, me parece sorprendente que no lo hagamos simplemente en el archivo xaml. –

+0

El enlace de propiedad fallará en esta situación, por lo que TargetNullValue nunca se usará. No puede tener un valor nulo para el objetivo si no pudo vincularse al objetivo. –

+0

Lo siento, no entendí que faltaba la propiedad, simplemente pensé que era nula ("si el nombre está vacío"). Mi error. –

0

este.. es teórico pero ...

Crearía un estilo personalizado y dirigiría todos tus bloques de texto. Dentro de tu estilo, puedes establecer un valor de texto predeterminado. Si su encuadernación no anula el estilo, se usará su valor predeterminado.

Style x:Key="TwitterTextBoxStyle" TargetType="{x:Type TextBox}"> 
    <Setter Property="Text" Value="" /> 
+0

Quiero que el valor predeterminado sea otro Enlace, no un valor estático :( –

3

puede aplicar un estilo con una DataTrigger:

<TextBlock> 
    <TextBlock.Style> 
     <Style TargetType="TextBlock"> 
      <Setter Property="Text" Value="{Binding Name}"/> 
      <Style.Triggers> 
       <!-- In this binding you could inject a converter which checks for more than null --> 
       <DataTrigger Binding="{Binding Name}" Value="{x:Null}"> 
        <Setter Property="Text" Value="{Binding}"/> 
       </DataTrigger> 
      <Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 
+0

Parece que funciona, pero tengo que saber algo para estar seguro, cuando solo uso {Encuadernación}. ¿A qué propiedad pertenece el campo? –

+0

@Guillaume, '{Binding}' significa usar el valor del DataContext actual como el valor para asignar a la propiedad. En otras palabras, una ruta vacía significa simplemente usar la instancia del objeto en lugar de una de sus propiedades. Aquí hay una práctica hoja de trucos para Sintaxis de enlace: http://www.nbdtech.com/Free/WpfBinding.pdf –

+1

@GuillaumeCogranne {Binding} se vinculará a lo que esté configurado en su contexto de datos actual.Entonces, en lugar de enlazar a la propiedad Name de una clase, se vincula a la clase que contiene la propiedad Name. –

Cuestiones relacionadas