2011-01-12 13 views
3

Gegeben:Conditional Laden von WPF-Steuerelemente

 <StackPanel>  
<View:ArcController x:Name="control1" Visibility="{Binding Path=CanShowDateControl, Converter={StaticResource bool2VisibilityConverter}}" /> 
<my1:DateLabelView x:Name="control2" DataContext="{Binding Path=DateLabelViewModel}" Visibility="{Binding ElementName=ctrlTableToolbar, Path=DataContext.IsDateReadOnly, Converter={StaticResource bool2VisibilityConverter}}" /> 

     </StackPanel>   

Ich habe zwei Kontrollen (control1 und control2) in einem Stackpanel, und auf einmal will ich nur eines der Steuerelemente zeigen. Wie im Code gezeigt, wird die Sichtbarkeit der Steuerelemente von "IsDateReadOnly" und "CanShowDateControl" gesteuert. Und nach meiner Viewmodel-Logik ... CanShowDateControl =! IsReadOnly.

So, auf einmal werde ich nur eine der beiden Kontrollen zeigen.

Frage: Mein Problem ist, obwohl ich nur ein Steuerelement zu einer Zeit zeige, erstellt meine XAML Instanz beider Steuerelemente. Ist es möglich, eine Instanz nur für das Steuerelement zu erstellen, das ich zeige?

dass Geben Sie:

1) Ich möchte zum Anzeigen/Verbergen mit Bindung, so dass die Logik in meinem Viewmodel liegt. 2) Ich kann diese beiden Steuerelemente in einem Wrapper-Steuerelement behalten. Da ich es an verschiedenen Orten benutze.

Vielen Dank für Ihr Interesse.

+0

Ist das Erstellen einer Instanz der beiden Steuerelemente so viel ein Problem? – ChrisF

+0

@ChrisF: Da ich mehrere Instanzen dieses Steuerelements erstellt habe, würde dies die Speicherauslastung erheblich optimieren, wenn ich dafür sorgen könnte, dass dieses Steuerelement weniger Speicher belegt. –

Antwort

3

Verwenden Sie eine ContentControl und ContentTemplateSelector mit zwei DataTemplate s. Eine für ReadOnly und andere für Not ReadOnly.

Geben Sie im Selektor basierend auf der Eigenschaft DataTemplate zurück.

Sie können auch eine Custom Control erstellen, die zwei (oder mehr wenn mehr als zwei) Eigenschaften zum Speichern von zwei Steuerelementen hat. Basierend auf einer Bedingung, sollte eine davon zu Visual Tree hinzugefügt werden, die verhindert, dass die andere geladen wird.