2 Stimmen

Ein Steuerelement wird standardmäßig ausgeblendet, wenn seine Sichtbarkeitseigenschaft gebunden ist und der Kontext nach "Loaded" festgelegt wird

Ich habe ein Rechteck mit seinem Visibility Eigenschaft, die an das Ansichtsmodell gebunden ist. Aus (scheinbaren) Leistungsgründen setze ich die DataContext in der Seite Loaded Veranstaltung. Dieses Rechteck sollte standardmäßig eingeklappt sein. Leider wird das Rechteck bei diesem "Late-Context"-Muster nur für ein paar Sekundenbruchteile angezeigt.

Gibt es eine Möglichkeit, sie ohne Code standardmäßig kollabieren zu lassen?

Wenn nein, könnte ich die Eigenschaft einfach auf Collapsed und binden es im Loaded-Ereignis, aber ich habe viele solcher Rechtecke in meiner App.

Könnte ich eine ContentControl die bis zum Laden zusammengeklappt ist? Ist diese zweite Idee zu weit hergeholt?

4voto

quetzalcoatl Punkte 29919

@Martin - haben Sie versucht, den FallbackValue in Ihrer Bindung zu setzen?

Ich habe den VS nicht zur Hand, um es zu überprüfen, aber ich denke, dass, wenn Ihr Setup ist wie (sorry für "Fehler", das ist nur ein Entwurf:

<rectangle visibility={Binding mydata.somthing.someVisibilityProperty} />

dann, wenn die Bindung bei Loaded, Ihr Steuerelement kann "blinken" mit dem Standardwert Visibility.Visible. Ihre Bindung schlägt beim ersten Rendering fehl, weil noch keine Daten gebunden sind. Wenn ja, dann richten Sie einfach den Fallbackvalue ein:

<rectangle visibility={Binding mydata.somthing.someVisibilityProperty, FallbackValue=Collapsed} />

Dies führt dazu, dass die Bindung "Visibility.Collapsed" zurückgibt, wenn sie nicht aus der Quelle lesen kann.

Im Falle von

<Rectangle Visibility="{Binding TipRoundingHasError, Converter={StaticResource VisibilityConverter}}">

die Sie in Ihrer zweiten Antwort dargelegt haben, würde dies im Wesentlichen so aussehen:

<Rectangle Visibility="{Binding TipRoundingHasError, FallbackValue=DEFAULTVALUE, Converter={StaticResource VisibilityConverter}}">

aber ich erinnere mich jetzt nicht, ob Ihr Konverter auf den FallbackValue aufgerufen wird oder nicht. Das bedeutet, dass ich Ihnen jetzt nicht sagen kann, ob Sie DEFAULTVALUE durch "Collapsed" oder eher durch "False" ersetzen sollten. Aber ich denke, Sie werden das Richtige im Handumdrehen testen und auswählen.

Weitere Beispiele für Fallback finden Sie in der BindingBase.FallbackValue - gibt es ein schönes Beispiel mit einer benutzerdefinierten Bindungsklasse (ja, nicht nur Konverter können benutzerdefiniert sein:) )

1voto

Martin Plante Punkte 4333

Ich habe eine AppearingControl dessen Implementierung sich der Bezeichnung "Kodierung" entzieht, da sie so einfach ist:`

public class AppearingControl : ContentControl
{
  public AppearingControl()
  {
    if( !System.ComponentModel.DesignerProperties.IsInDesignTool )
    {
      this.Visibility = System.Windows.Visibility.Collapsed;
      this.Loaded += new RoutedEventHandler( AppearingControl_Loaded );
    }
  }

  void AppearingControl_Loaded( object sender, RoutedEventArgs e )
  {
    this.Loaded -= new RoutedEventHandler( AppearingControl_Loaded );

    this.ClearValue( AppearingControl.VisibilityProperty );
  }
}

Ich kann die Kontrolle auf diese Weise nutzen:

<slim:AppearingControl HorizontalContentAlignment="Stretch" 
                       VerticalContentAlignment="Stretch">
    <Rectangle Visibility="{Binding TipRoundingHasError, Converter={StaticResource VisibilityConverter}}">
        <Rectangle.Fill>
            <SolidColorBrush Color="#FFFF4040" Opacity="0.5"/>
        </Rectangle.Fill>
    </Rectangle>
</slim:AppearingControl>

Kann mir jemand bestätigen, dass ich das Rad nicht gerade neu erfunden habe, oder noch schlimmer, eine Bazooka benutzt habe, um eine Fliege zu töten?

Danke.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X