Silverlight 3 DataForm, como para exibir / ocultar campos
-
10-07-2019 - |
Pergunta
Eu tenho um DataForm que pus a visibilidade de determinados DataFields a ser entrou em colapso, e quando o usuário seleciona uma opção a partir de uma caixa de combinação, certos DataFields deve ser feita visível novamente.
Basicamente (em pseudocódigo áspero).
OnComboBoxChange =
if this.index = 1 then
DataForm.Fields[1].Visibility = Visible
else
DataForm.Fields[2].Visibility = Visible
Os pontos de bónus para uma resposta que é aplicável a um padrão MVVM.
Solução
Aqui está um exemplo usando MVVM que evita CodeBehind (discutível MVVM não-não):
<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>
Aqui está o seu ViewModel então,
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...
}
simples Pretty. Eu provavelmente tentar nomear meu propriedades algo um pouco mais "Modelo" e menos "View", mas essa convenção não é totalmente inadequada.
Outras dicas
No contexto de um ajuste a visibilidade dos controles padrão MVVM pertence à vista, tanto quanto eu posso ver. De qualquer forma, você pseudocódigo faz o trabalho mais ou menos. Aqui estão alguns fragmentos que são um pouco mais concreto:
<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>
e
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;
}
}
}