2016-07-24 12 views
0

Meine Anwendung zeigt ein UserControl zum Hinzufügen eines neuen Objekts. Sobald das Objekt hinzugefügt wurde, werden die Attribute des erstellten Objekts angezeigt.Wechsel zwischen den Zuständen in UserControls

State 1: Leere Usercontrol
Empty UserInput

Zustand 2: Gefüllt Usercontrol
Filled UserInput

Ich dachte, es gibt zwei Möglichkeiten, wie ich könnte so etwas wie dies realisieren:

  1. erstellen 1 Usercontrol mit 2 verschiedenen visuellen Zuständen - Wechsel zwischen Zuständen, je nachdem ob th Die Steuerung enthält eine Objektinstanz oder nicht
  2. Erstellen Sie 2 UserControls ohne einen Status und zeigen Sie die aktuell benötigte Instanz an. Dies erfordert einen Kontrollmechanismus auf höherer Ebene, um das richtige Steuerelement hinzuzufügen/zu entfernen.

Was ist die beste Praxis in einem Fall wie diesem? Was sind die Nachteile, um das eine oder andere zu tun? Gibt es andere Möglichkeiten, an die ich noch nicht gedacht habe?

Antwort

1

Ich würde zwei Datatemplates in UserControl.Resources erstellen und sie mit einem Trigger tauschen. CreateUserTemplate hat nur eine Schaltfläche an eine CreateUserCommand oder ein Klickereignis gebunden. EditUserTemplate ist die Benutzer-Bearbeitungsvorlage. Content="{Binding}" ohne Pfad verwendet die DataContext als Content. Wenn ich die genauen Details deines Viewmodels hätte, könnte ich dir genauere Informationen darüber geben, wie du den Inhalt hier her bekommst.

Ich gehe auch davon aus, dass das Viewmodel eine nullbare UserID Eigenschaft hat.

<ContentControl 
    Content="{Binding}" 
    > 
    <ContentControl.Style> 
     <Style TargetType="ContentControl"> 
      <!-- Default has to go in a setter in the Style, not an 
       attribute on the ContentControl tag --> 
      <Setter 
       Property="ContentTemplate" 
       Value="{StaticResource EditUserTemplate}" 
       /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding UserID}" Value="{x:Null}"> 
        <Setter 
         Property="ContentTemplate" 
         Value="{StaticResource CreateUserTemplate}" 
         /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentControl.Style> 
</ContentControl> 

Sie könnten einen Datatemplateselector stattdessen aber für diese triviale Art der Sache schreiben, finde ich es einfacher, alles in XAML zu tun.

1

Für diesen speziellen Zweck bietet WPF VisualStateManager.

<UserControl ...> 
    <Grid> 
     <VisualStateManager.VisualStateGroups> 
      <VisualStateGroup Name="States"> 
       <VisualState x:Name="WithoutObject"> 
        <Storyboard> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetName="WithoutObjectPanel" Storyboard.TargetProperty="Visibility"> 
          <DiscreteObjectKeyFrame KeyTime="0:0:0"> 
           <DiscreteObjectKeyFrame.Value> 
            <Visibility>Visible</Visibility> 
           </DiscreteObjectKeyFrame.Value> 
          </DiscreteObjectKeyFrame> 
         </ObjectAnimationUsingKeyFrames> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetName="WithObjectPanel" Storyboard.TargetProperty="Visibility"> 
          <DiscreteObjectKeyFrame KeyTime="0:0:0"> 
           <DiscreteObjectKeyFrame.Value> 
            <Visibility>Collapsed</Visibility> 
           </DiscreteObjectKeyFrame.Value> 
          </DiscreteObjectKeyFrame> 
         </ObjectAnimationUsingKeyFrames> 
        </Storyboard> 
       </VisualState> 
       <VisualState x:Name="WithObject"> 
        <Storyboard> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetName="WithoutObjectPanel" Storyboard.TargetProperty="Visibility"> 
          <DiscreteObjectKeyFrame KeyTime="0:0:0"> 
           <DiscreteObjectKeyFrame.Value> 
            <Visibility>Collapsed</Visibility> 
           </DiscreteObjectKeyFrame.Value> 
          </DiscreteObjectKeyFrame> 
         </ObjectAnimationUsingKeyFrames> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetName="WithObjectPanel" Storyboard.TargetProperty="Visibility"> 
          <DiscreteObjectKeyFrame KeyTime="0:0:0"> 
           <DiscreteObjectKeyFrame.Value> 
            <Visibility>Visible</Visibility> 
           </DiscreteObjectKeyFrame.Value> 
          </DiscreteObjectKeyFrame> 
         </ObjectAnimationUsingKeyFrames> 
        </Storyboard> 
       </VisualState> 
      </VisualStateGroup> 
     </VisualStateManager.VisualStateGroups> 

     <StackPanel x:Name="WithoutObjectPanel" Visibility="Hidden"> 
      <TextBlock Text="Without object :("/> 
     </StackPanel> 

     <StackPanel x:Name="WithObjectPanel" Visibility="Visible"> 
      <TextBlock Text="With object :) !!!!"/> 
     </StackPanel> 
    </Grid> 
</UserControl> 

UserControl.cs

public partial class UserControl1 : UserControl 
{ 
    object _anObject; 
    public object AnObject 
    { 
     get { return _anObject; } 
     set { _anObject = value; 
      if(value == null) VisualStateManager.GoToState(this, "WithoutObject", true); 
      else VisualStateManager.GoToState(this, "WithObject", true); 
     } 
    } 
    ... 
}