2010-04-19 7 views
12

Je travaille sur un grand projet WPF et pendant déboguer ma fenêtre de sortie est rempli avec ces avertissements ennuyeux:Comment se débarrasser de l'avertissement contraignant de liaison HorizontalContentAlignment ennuyeux?

System.Windows.Data Informations: 10: ne peut pas récupérer la valeur en utilisant la liaison et pas valide> valeur de repli existe; en utilisant par défaut à la place. BindingExpression: Path = HorizontalContentAlignment; DataItem = null; l'élément cible est 'ComboBoxItem' (Name = ''); cible propriété est « HorizontalContentAlignment » (type> « HorizontalAlignment »)

Dans l'exemple spécifique ComboBoxItem est de style ainsi:

<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> 

Je sais que le problème est généré par la définition du thème par défaut pour ComboBoxItem qui contient des choses comme:

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

mais je pense également que l'utilisation

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

prendrait soin du problème, et à la place des avertissements sont toujours là.

EDIT: Pour reproduire le problème, vous devez remplacer également le style de ComboBox exactement comme fait dans cet exemple de MSDN: ComboBox ControlTemplate Example

Toute aide est vraiment apprécié

+0

Je ne peux pas reproduire votre problème avec ce XAML ni dans 4.0 ni dans 3.5. Il fonctionne bien sans aucun avertissement contraignant. – majocha

+0

vous avez raison, j'ai testé seul et il ne me donne pas d'avertissement, je modifie la question pour plus de détails – Drake

+0

Je ne peux pas voir cette liaison problématique dans l'exemple que vous avez lié dans edit. – majocha

Répondre

1

Je ne Je ne sais pas si après plus d'un an vous êtes toujours intéressé par ce problème, mais ma solution était d'écrire explicitement dans le style la valeur pour cela. Par exemple:

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

Et cela a simplement résolu ce problème.

1

Même problème est avec « MenuItem » si elle est placée directement dans les panneaux comme etc. « StackPanel » et peut être fixé à l'aide de la réponse Carter ci-dessus, juste Remplacer 'ComboBoxItem' avec 'MenuItem' dans ce 'Style'

0

Je veux juste mentionner que j'ai lutté avec un problème similaire pendant deux jours (le mien était une erreur "Windows Data Error 4", se plaindre de HorizontalContentAlignment et VerticalContentAlignment). La solution suggérée la plus courante (l'ajout du Style Horizontal/VerticalContentAlignment à votre élément, ou même à App.xaml) ne résout PAS toujours le problème.

Finalement, j'ai découvert quelque chose d'unique à ma propre situation - j'espère qu'il peut être utile à quelqu'un: Si vous utilisez le FilterEventHandler, ne le désinscrivez pas avant de vous réabonner!

Mon ancien code gardé sur la production que « Erreur de données 4 » un message à chaque fois que je l'ai changé le filtre de canal (qui appelle 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; 
    } 
} 

... donc je l'ai changé pour réabonner à la FilterEventHandler à chaque fois, et plutôt mettre la vérification pour une null sur Channel Filter dans la méthode de gestion des événements.

// 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! Plus d'erreurs :-)

Questions connexes