2009-08-03 9 views
0

J'ai un DataForm dans lequel j'ai défini la visibilité de certains DataFields à réduire, et lorsque l'utilisateur sélectionne une option d'un ComboBox, certains DataFields doivent redevenir visibles.Silverlight 3 DataForm, comment afficher/masquer des champs

Fondamentalement (en pseudocode rugueux).

OnComboBoxChange = 
    if this.index = 1 then 
     DataForm.Fields[1].Visibility = Visible 
    else 
     DataForm.Fields[2].Visibility = Visible 

points bonus pour une réponse qui est applicable à un modèle MVVM.

Répondre

5

Voici un échantillon en utilisant MVVM qui évite codebehind (MVVM discutable non-non):

<UserControl> 
    <StackPanel> 
    <ComboBox x:Name="comboBox" SelectionChanged="comboBox_SelectionChanged"/> 
    <StackPanel Orientation="Horizontal" Visibility="{Binding IsFirstFormShown}"> 
     <TextBlock Text="First: "/> 
     <TextBox/> 
    </StackPanel> 
    <StackPanel Orientation="Horizontal" Visibility="{Binding IsSecondFormShown}"> 
     <TextBlock Text="Second: "/> 
     <TextBox/> 
    </StackPanel> 
    </StackPanel> 
</UserControl> 

Voilà votre ViewModel puis,

public class MyFormViewModel : INotifyPropertyChanged 
{ 
    private System.Windows.Visibility _isFirstShown; 
    public System.Windows.Visibility IsFirstFormShown 
    { 
      get { return _isFirstShown; } 
      set 
      { 
       _isFirstShown = value; 
       if (PropertyChanged != null) 
       { 
        PropertyChanged(this, new PropertyChangedEventArgs(value)); 
       } 
      } 
    } 

    //TODO: implement the other property (writing code in this edit window makes me tired) 
    //hopefully you get the picture here... 
} 

Assez simple. J'essaierais probablement de nommer mes propriétés quelque peu plus "Model" et moins "View", mais cette convention n'est pas totalement inappropriée.

2

Dans le contexte d'un paramètre de modèle MVVM, la visibilité des contrôles appartient à la vue aussi loin que je peux voir. Quoi qu'il en soit, vous pseudocode fait le travail plus ou moins. Voici quelques fragments qui sont un peu plus concret:

<UserControl> 
    <StackPanel> 
    <ComboBox x:Name="comboBox" SelectionChanged="comboBox_SelectionChanged"/> 
    <StackPanel x:Name="firstPanel" Orientation="Horizontal"> 
     <TextBlock Text="First: "/> 
     <TextBox/> 
    </StackPanel> 
    <StackPanel x:Name="secondPanel" Orientation="Horizontal"> 
     <TextBlock Text="Second: "/> 
     <TextBox/> 
    </StackPanel> 
    </StackPanel> 
</UserControl> 

et

public partial class MainPage : UserControl { 

    public MainPage() { 
    InitializeComponent(); 
    this.comboBox.ItemsSource = new String[] { "First", "Second" }; 
    this.comboBox.SelectedIndex = 0; 
    } 

    void comboBox_SelectionChanged(Object sender, SelectionChangedEventArgs e) { 
    ShowPanel((String) this.comboBox.SelectedItem); 
    } 

    void ShowPanel(String name) { 
    if (name == "First") { 
     this.firstPanel.Visibility = Visibility.Visible; 
     this.secondPanel.Visibility = Visibility.Collapsed; 
    } 
    else { 
     this.firstPanel.Visibility = Visibility.Collapsed; 
     this.secondPanel.Visibility = Visibility.Visible; 
    } 
    } 

} 
Questions connexes