2013-03-18 18 views
5

Ho due User Control's seduto nell'unità principale UserCotrol.Sostituzione UserControl per proprietà

solo uno di essi dovrebbe essere nel principale.

quando si modificano alcune proprietà nel ViewModel, li cambio in questo modo:

<UserControl> 
    <ContentControl> 
     <ContentControl.Style> 
      <Style TargetType="{x:Type ContentControl}"> 
       <Setter Property="Content"> 
        <Setter.Value> 
         <local:UserControl1/> 
        </Setter.Value> 
       </Setter> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsTwo}" Value="True"> 
         <Setter Property="Content"> 
          <Setter.Value> 
           <local:UserControl2/> 
          </Setter.Value> 
         </Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
</UserControl> 

Quando cambio la proprietà per False va a UserControl1 senza problemi, ma quando lo cambio a True, ci sono problemi con il display e solo quando mi muovo tra gli schermi si adatta, come soluzione temporanea, ho creato eventi ogni volta che UserControl dovrebbe cambiare da 1 a 2. Quando viene eseguito quell'evento, elimino lo UserControl principale e lo creo di nuovo.

Ma la mia domanda è perché quando cambio a uno non ho bisogno di ricreare, e quando ne cambio a due ho bisogno?

Non darmi alcuna idea su come risolvere questo problema (l'ho fatto io stesso), voglio spiegare perché questo sta accadendo, questo è ciò che mi interessa.

+0

Cosa intendi per "problemi con il display?" Puoi mostrare uno screenshot? –

+0

@DanPuzey, la mia intenzione: non viene visualizzato sullo schermo come dovrebbe essere visualizzato, sembra che sia bloccato con il precedente usercontorol ('UserControl1'), anche io non posso più accedervi, (clic sui pulsanti in UserCotrol non sta andando da nessuna parte, non il primo e non il secondo) –

+0

Se si riduce a icona e si ripristina la finestra, quale controllo viene visualizzato?Mi chiedo se per qualche motivo il tuo contenuto stia cambiando, ma la finestra non sta eseguendo il rerendering. –

risposta

5

WPF va bene; Non riesco a riprodurre il tuo problema; Avviare una nuova applicazione WPF e scaricare questo in esso: quindi sostituirli con il controllo utente (ricordate che potrebbe essere necessario associare il controllo utente nel vostro modello se si desidera che legato a qualcosa di specifico)

ViewModel.cs:

public class ViewModel : INotifyPropertyChanged 
{ 
    private bool _isTwo; 

    public bool IsTwo 
    { 
     get { return _isTwo; } 
     set 
     { 
      _isTwo = value; 
      OnPropertyChanged("IsTwo"); 
     } 
    } 

    public ICommand Switch 
    { 
     get { return new RelayCommand((_) => { IsTwo = !IsTwo; }, (_) => true); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

public class RelayCommand : ICommand 
{ 
    private readonly Action<object> _action; 
    private readonly Func<object, bool> _predicate; 

    public RelayCommand(Action<object> action, Func<object, bool> predicate) 
    { 
     _action = action; 
     _predicate = predicate; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return _predicate(parameter); 
    } 

    public void Execute(object parameter) 
    { 
     _action(parameter); 
    } 

    public event EventHandler CanExecuteChanged; 
} 

MainWindow

<Window.DataContext> 
    <local:ViewModel/> 
</Window.DataContext> 

<DockPanel> 
    <Button DockPanel.Dock="Top" Command="{Binding Switch}"> Switch </Button> 
    <UserControl> 
     <ContentControl > 
      <ContentControl.Style> 
       <Style TargetType="{x:Type ContentControl}"> 
        <Setter Property="Content"> 
         <Setter.Value> 
          <local:UserControl1 DataContext="{Binding UserControl1ViewModel}"/> 
         </Setter.Value> 
        </Setter> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding IsTwo}" Value="True"> 
          <Setter Property="Content"> 
           <Setter.Value> 
            <local:UserControl2/> 
           </Setter.Value> 
          </Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </ContentControl.Style> 
     </ContentControl> 
     </UserControl> 
</DockPanel> 

Creare due nuovi controlli utente (vuoto) e impostare due diversi colori:

Off On

Sostituire uno di questi con il controller utente in difficoltà. Se hai problemi di layout, con ogni probabilità i controlli utente stanno tentando di ridimensionare se stessi, oppure devi metterli in un contenitore migliore. Sto attaccando quanto sopra in un DockPanel. Il che è generalmente abbastanza efficace nell'espandere i controlli nello spazio disponibile.

[Edit]

Quindi, se volete sapere che cosa si crea quando, schiaffo questo alcuni messageboxes in di controllo utente ctor

public UserControl1() 
{ 
    InitializeComponent(); 

    MessageBox.Show("Created UserControl1"); 
} 

public UserControl2() 
{ 
    InitializeComponent(); 

    MessageBox.Show("Created UserControl2"); 
} 

Per me, entrambi sono creati all'avvio dell'applicazione. Ad esempio UserControl2 non è ancora visibile, ma viene creato. Si presume che non sia vincolato fino a quando non si commuta il Trigger dei dati; ma se si è eseguire codice code behind nel proprio controllo utente, ciò potrebbe rovinare WPF.

Problemi correlati