2010-04-19 2 views
12

estoy trabajando en un gran proyecto de WPF y durante depurar mi ventana de salida está llena de estas molestas advertencias:¿Cómo deshacerse de la molesta advertencia de enlace HorizontalContentAlignment?

System.Windows.Data Información: 10: No se puede recuperar el valor utilizando vinculante y carece de valor válido> repliegue existe; usando el valor predeterminado en su lugar. BindingExpression: Path = HorizontalContentAlignment; DataItem = null; elemento de destino es 'ComboBoxItem' (Name = ''); apuntar propiedad es 'HorizontalContentAlignment' (tipo> ' HorizontalAlignment')

En el ejemplo específico ComboBoxItem es de estilo en esta forma:

<Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}"> 
    <Setter Property="OverridesDefaultStyle" Value="True"/> 
    <Setter Property="SnapsToDevicePixels" Value="True"/>     
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ComboBoxItem}"> 
       <Border 
        Name="bd" 
        Padding="4,4,4,4" 
        SnapsToDevicePixels="True" 
        CornerRadius="2,2,2,2"> 
        <ContentPresenter /> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsHighlighted" Value="true"> 
         <Setter TargetName="bd" Property="Background" Value="{StaticResource MediumBrush}"/> 
         <Setter TargetName="bd" Property="Padding" Value="4,4,4,4"/> 
         <Setter TargetName="bd" Property="CornerRadius" Value="2,2,2,2"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Yo sé que el problema se genera por la definición de tema por defecto para ComboBoxItem que contiene cosas como:

<Setter Property="Control.HorizontalContentAlignment"> 
     <Setter.Value> 
      <Binding Path="HorizontalContentAlignment" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ItemsControl, AncestorLevel=1}" /> 
      </Setter.Value> 
     </Setter> 

pero también pensó que el uso

<Setter Property="OverridesDefaultStyle" Value="True"/> 

se encargaron del problema, y ​​en su lugar, las advertencias siguen allí.

EDIT: Con el fin de reproducir el problema se debe redefinir también el estilo de ComboBox exactamente igual que hace en este ejemplo de MSDN: ComboBox ControlTemplate Example

Cualquier ayuda es muy apreciada

+0

No puedo reproducir su problema con este XAML ni en 4.0 ni en 3.5. Funciona bien sin ninguna advertencia vinculante. – majocha

+0

tiene razón, probé solo y no me avisa, edito la pregunta para más detalles – Drake

+0

No puedo ver esa encuadernación problemática en el ejemplo que ha vinculado en la edición. – majocha

Respuesta

1

I don' Sé si después de más de un año todavía está interesado en este problema, pero mi solución fue escribir explícitamente en el estilo el valor de esto. Por ejemplo:

<Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}"> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 

Y eso simplemente resolvió ese problema.

1

El mismo problema es con 'Menultem' si se coloca directamente en los paneles como etc. 'StackPanel' Y se puede solucionar con la respuesta de Carter arriba, solo reemplace 'ComboBoxItem' con 'MenuItem' en ese 'Estilo'

0

Solo quiero mencionar que luché con un problema similar durante dos días (el mío fue un error de "Error de datos de Windows 4", quejándose de HorizontalContentAlignment y VerticalContentAlignment). La solución sugerida más común (agregar el Estilo de alineación horizontal/vertical a su elemento, o incluso a la aplicación.xaml) NO siempre resuelve el problema.

Eventualmente, descubrí algo único en mi propia situación. Espero que pueda ser de ayuda para alguien: Si está utilizando FilterEventHandler, ¡no anule su suscripción antes de volver a suscribirse!

Mi código antiguo fue generando que "los datos de error 4" mensaje cada vez que cambia el filtro de canal (que llama a UpdateCorporatesList):

// This code generates errors 
private void UpdateCorporatesList() 
{ 
    this.CorporatesViewSource.Filter -= new FilterEventHandler(ApplyCorporateFilter); 

    if (this.ChannelFilter != null) 
    { 
     this.CorporatesViewSource.Filter += new FilterEventHandler(ApplyCorporateFilter); 
    } 
    else 
    { 
     this.CorporateFilter = null; 
    } 
} 

private void ApplyCorporateFilter(object sender, FilterEventArgs e) 
{ 
    SalesCorporate customer = e.Item as SalesCorporate; 
    var currentChannel = this.Channels.FirstOrDefault(x => x.ID == this.ChannelFilter).Description; 
    if ((customer.ID != null) && (customer.Channel != currentChannel)) 
    { 
     e.Accepted = false; 
    } 
} 

... así que lo cambió a volver a suscribirse a la FilterEventHandler cada vez, y más bien poner la verificación de un nulo en el filtro de canal en el método de manejo de eventos.

// This code works as intended 
private void UpdateCorporatesList() 
{ 
    this.CorporatesViewSource.Filter += new FilterEventHandler(ApplyCorporateFilter); 

    if (this.ChannelFilter == null) 
    { 
     this.CorporateFilter = null; 
    } 
} 

private void ApplyCorporateFilter(object sender, FilterEventArgs e) 
{ 
    var currentChannel = this.Channels.FirstOrDefault(x => x.ID == this.ChannelFilter); 
    if (currentChannel.ID == null) 
    { 
     return; 
    } 

    SalesCorporate customer = e.Item as SalesCorporate; 
    if ((customer.ID != null) && (customer.Channel != currentChannel.Description)) 
    { 
     e.Accepted = false; 
    } 
} 

Et Voila! No más errores :-)

Cuestiones relacionadas