2009-07-20 7 views
2

Ich habe ein Benutzersteuerelement und ein zugehöriges Ansichtsmodell erstellt. Die Eigenschaften "DisplayName" und "TimeIntervalLength" des View-Modells werden in der Benutzersteuerungsansicht DataBinding angezeigt. Abhängig von diesen Eigenschaften des Ansichtsmodells möchte ich die Breite meines Steuerelements aktualisieren. Die Breite sollte "TimeIntervalLength" aber mindestens "DisplayName" sein. Ich habe versucht, "OnPropertyChanged" zu überschreiben, aber das funktioniert nicht. Außerdem konnte ich kein geeignetes Ereignis zum Überschreiben finden.Verwenden von DataBinding-Werten zum Aktualisieren der Breite eines Steuerelements (WPF)

Vielen Dank im Voraus.

+0

Es würde bei der Ermittlung der Grundursache helfen, wenn Sie buchen könnten, wie Sie Ihre Bindungen deklariert haben. Es könnte eine Vielzahl verschiedener Probleme sein. Vielen Dank! –

Antwort

1

Sie können nur versuchen, nicht eine Breite/Höhe auf Ihrem Usercontrol angeben. Es sollte zu den Steuerelementen passen, die darin gehostet werden.

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

Eine weitere Option ist ein IValueConverter zu verwenden, um einige schwerere Heben zu tun:

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

Schweres Heben in Ihrem 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

Meta-Kommentar: ActualWidth zeigt nicht immer, dass das geändert wurde, insbesondere wenn Sie eine LayoutTransform anwenden. Möglicherweise müssen Sie zusätzliche Logik hinzufügen, damit die Bindung erneut ausgewertet wird. – user7116

0

nicht ganz sicher, ob ich das richtig verstehen, aber es klingt wie die einfachste Sache, eine berechnete Eigenschaft auf Ihr Ansichtsmodell hinzufügen zu tun wäre, und bindet dann an, dass aus der Sicht:

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

(Ihnen Offensichtlich ersetzen „CalculateDisplayWidth()“ kann mit dem, was Sie brauchen)

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

Statt Steuern Breite, Steuer MinWidth. Und löschen Sie die Width -Eigenschaft im Konstruktor von UserControl:

this.ClearValue(WidthProperty);