2010-12-22 4 views
1

Ich habe einen ValueConverter, der abhängig von einer Eigenschaft mit einem dynamischen Parameter aufgerufen werden muss. Ich kann nicht sehen, wie man dies zu tun ...Silverlight 4 Bindung an ConverterParameter

Width="{Binding ActualWidthValue, Source={StaticResource VisibleSize}, Converter={StaticResource Fraction}}" 

Die „Fraktion“ des Wandlers get (oder sollte erhalten) einen Parameter des Typs System.Size, die einen Zähler und Nenner enthält. Dieser Wert hängt von ItemCollection.Count ab. Durch das Zurücksetzen der ItemCollection sollte der Converter erneut mit den neuen Werten aufgerufen werden.

Meine erste Idee war, das ConverterParameter in CodeBehind auf dem PropertyChanged-Ereignis meiner ItemCollection DependencyProperty manuell zu ändern. Aber wie ich jetzt weiß, hat Silverlight keine GetBinding() -Methode. Ich habe von GetBindingExpression gehört und versucht zu tun. Aber MyGrid.GetBindingExpression (Grid.ActualHeightProperty) gibt immer null zurück, obwohl die Bindung bereits eingerichtet ist.

Also, was kann ich tun, um mein Ziel zu erreichen?


Meine Implementierung war nicht viel anders. Ich setze den ConverterParameter in CodeBehind, kurz bevor der Converter über Binding aufgerufen wird. Das hat nicht funktioniert (Parameter enthält immer noch den Initialisierungswert).

Ich werde versuchen, Ihren Vorschlag zu verwenden. Aber warum ConverterParameter keine DependencyPropery sein kann. Was ist die Idee dahinter? Weiss es jemand?

Antwort

2

Wenn ..
, was Sie mit „abhängig von einer Eigenschaft“ ist, dass es eine andere Eigenschaft des Datacontext ist abgesehen von ActualWidthValue, die Sie benötigen, um den Wert, den Sie Breite
zuweisen möchten zu berechnen .. dann:

Ändern Sie den IValueConverter, den Sie "Fraction" aufrufen, um stattdessen das gesamte Objekt zu übernehmen. Es kann den Wert von ActualWidthValue und alle anderen Werte, die es benötigt, und dann die erforderliche Breite zurückgeben.

bearbeiten

Von Ihrem Kommentar sehe ich das meine erste „wenn ..“ Absatz falsch ist. Sie haben tatsächlich einen gemeinsamen Wert für das UserControl, das dieser Konverter verwenden sollte. In diesem Fall fügen Sie dem Konverter eine Eigenschaft hinzu, es ist schließlich nur eine andere Klasse. Wenn die Eigenschaft für das Benutzersteuerelement festgelegt ist, weisen Sie dieser Eigenschaft ihren Wert zu.Zum Beispiel: -

Einige Werteumwandler: -

public class SomeConverter : IValueConverter 
{ 

    public int SomeFactor { get; set } 
    // IValueConverter implementation here uses SomeFactor 
} 

Usercontrol XAML: -

<UserControl.Resources> 
    <local:SomeConverter x:Key="Fraction" SomeFactor="15" /> 
</UserControl.Resources> 

Usercontrol Codebehind: -

public int SomeFactor 
{ 
     get { return ((SomeConverter)Resources["Fraction"]).SomeFactor; } 
     set { ((SomeConverter)Resources["Fraction").SomeFactor = value; } 
} 
+0

Richtig, ich brauche einen anderen Wert - neben ActualWidthValue - um den richtigen Ausgangswert zu berechnen. Ich wollte diesen Wert als Parameter meiner Convert() - Methode übergeben. Der Koeffizient - sozusagen - ist eine Eigenschaft meines UserControl. Der ActualWidthValue ist eine Eigenschaft einer StaticResource, die ich verwende. Also, wie kann ich meinen IValueConverter ändern, um das gesamte UserControl UND meinen ActualWidthValue zu übernehmen? – 0xbadf00d

+0

@ FREEzE2046: Siehe bearbeiten – AnthonyWJones

1

Klingt, als ob Sie eine MultiBinding verwenden möchten. Es ist eine WPF-Feature, aber wie bei vielen Dingen gibt es 3rd-Party-Implementierungen:

http://www.scottlogic.co.uk/blog/colin/2010/05/silverlight-multibinding-solution-for-silverlight-4/

Sie dann in der ActualWidthValue und das Element Sammlung zählen in als separate Parameter übergeben konnte.

+0

Danke für Ihre Antwort. Ich kenne MultiBinding und verfüge bereits über eine funktionierende Implementierung. Aber das spielt hier keine Rolle. Ich brauche nur einen Wert als Parameter. Mein Problem ist, dass ich den ConverterParameter nicht mit Binding verwenden kann. Jede StaticResource funktioniert gut. Gibt es keine Möglichkeit, eine Bindung mit ConverterParameter einzurichten? – 0xbadf00d

+0

Wenn ich eine Bindung verwenden: Width = "{Binding ActualWidthValue, Quelle = {StaticResource VisibleSize}, Converter = {StaticResource-Fraktion}, ConverterParameter = {Binding ElementName = ColumnFraction}}" dann bekomme ich die Meldung "Wert fällt nicht in der erwartete Bereich "... Völlig leer - meiner Meinung nach. – 0xbadf00d

+0

@ FrEEzE2046: Sie können keine Bindung für einen ConverterParameter verwenden. Das Ziel einer Bindung (d. H. Die Eigenschaft, deren Wert auf "{Binding ...}" gesetzt ist) muss eine Abhängigkeitseigenschaft sein, aber Binding.ConverterParameter ist keine Abhängigkeitseigenschaft. Und was die nicht hilfreiche Fehlermeldung anbelangt, ... nun, sagen wir mal, das ist ein Aspekt von Silverlight, der etwas Verbesserung bringen könnte. –

-4

Vielleicht könnten Sie tun:

<Image.Width> 
<Binding Path="Rank" Converter="{StaticResource RankWidthConverter}" ConverterParameter="{Binding Path=Width, ElementName=barBorder}" /> 
</Image.Width> 
+4

in einer besseren Welt vielleicht –