代码之家  ›  专栏  ›  技术社区  ›  ChadT

Silverlight 3数据表单,如何显示/隐藏字段

  •  0
  • ChadT  · 技术社区  · 16 年前

    我有一个DataForm,我已经将某些数据字段的可见性设置为折叠,当用户从组合框中选择一个选项时,某些数据字段应该再次可见。

    基本上(粗略的伪代码)。

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

    适用于MVVM模式的答案的奖励点数。

    2 回复  |  直到 16 年前
        1
  •  5
  •   Anderson Imes    16 年前

    下面是一个使用MVVM的示例,它避免了代码隐藏(有争议的MVVM否):

    <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>
    

    这是你的视图模型,

    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...
    }
    

    很简单。我可能会尝试将我的属性命名为更多的“模型”和更少的“视图”,但这种约定并不完全不合适。

        2
  •  2
  •   Martin Liversage    16 年前

    在MVVM模式设置的上下文中,控件的可见性在我看来属于视图。不管怎样,伪代码或多或少地完成了任务。以下是一些更具体的片段:

    <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>
    

    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;
        }
      }
    
    }
    
    推荐文章