2009-07-20 4 views
2

J'ai créé un contrôle utilisateur et un modèle de vue associé. Les propriétés "DisplayName" et "TimeIntervalLength" du modèle de vue sont affichées dans la vue de contrôle utilisateur DataBinding. En fonction de ces propriétés du modèle de vue, je souhaite mettre à jour la largeur de mon contrôle. La largeur doit être "TimeIntervalLength" mais au moins "DisplayName". J'ai essayé de remplacer "OnPropertyChanged" mais cela ne fonctionne pas. De plus, je n'ai pas pu trouver un événement approprié à remplacer.Utilisation de valeurs DataBinding pour mettre à jour la largeur d'un contrôle (WPF)

Merci d'avance.

+0

Cela aiderait à déterminer la cause première si vous pouviez afficher comment vous avez déclaré vos liaisons. Cela pourrait être une variété de problèmes différents. Merci! –

Répondre

1

vous pouvez juste essayer de ne pas spécifier une largeur/hauteur de votre UserControl. Il devrait correspondre aux contrôles hébergés dans.

<UserControl x:Class="MyUserControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel> 
     <TextBlock x:Name="TextBlock1" Text="DisplayName Goes Here" /> 
     <local:TimeIntervalControl x:Name="TimeInterval" /> 
    </StackPanel> 
</UserControl> 

Une autre option consiste à utiliser un IValueConverter à faire soulever des charges plus lourdes:

<UserControl x:Class="MyUserControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <UserControl.Resources> 
     <local:MaxValueConverter x:Key="MaxValue" /> 
    </UserControl.Resources> 
    <UserControl.Width> 
     <MultiBinding Converter="{StaticResource MaxValue}"> 
      <Binding Path="ActualWidth" ElementName="TextBlock1" /> 
      <Binding Path="ActualWidth" ElementName="TimeInterval" /> 
     </MultiBinding> 
    </UserControl.Width> 
    <StackPanel> 
     <TextBlock x:Name="TextBlock1" Text="DisplayName Goes Here" /> 
     <local:TimeIntervalControl x:Name="TimeInterval" /> 
    </StackPanel> 
</UserControl> 

levage lourd dans votre MaxValueConverter:

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    if (values == null) 
    { 
     return Binding.DoNothing; 
    } 

    return values.Max(obj => (obj is double) ? (double)obj : 0.0); 
} 
+0

Méta-commentaire: ActualWidth ne montre pas toujours qu'il a changé, surtout si vous appliquez un LayoutTransform. Vous devrez peut-être ajouter une logique supplémentaire pour que la liaison soit réévaluée. – user7116

0

Pas tout à fait sûr si je comprends bien, mais il semble que la meilleure chose à faire serait d'ajouter une propriété calculée à votre ViewModel puis se lier à celui de la vue:

// In your model 
public int DisplayWidth { 
    get { return CalculateDisplayWidth(); } // todo 
} 

(Évidemment, vous peut remplacer « CalculateDisplayWidth() » avec tout ce dont vous avez besoin)

<!-- In your view --> 
<UserControl x:Class="MyUserControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="{Binding Path=DisplayWidth, Mode=OneWay}"> 

</UserControl> 
0

Au lieu de contrôler la largeur, le contrôle MinWidth. Et effacez la propriété Width dans le constructeur de UserControl:

this.ClearValue(WidthProperty); 
Questions connexes