【问题标题】:Accessing and changing WPF elements through a variable name通过变量名访问和更改 WPF 元素
【发布时间】:2010-06-04 11:28:29
【问题描述】:

我有一系列标记为 24 小时制的按钮。例如;

<StackPanel Orientation="Horizontal">
     <ToggleButton Content="00:00" Name="thetime0000"/>
     <ToggleButton Content="01:00" Name="thetime0100" />
     <ToggleButton Content="02:00" Name="thetime0200" />
     <ToggleButton Content="03:00" Name="thetime0300" />

等等

现在我将每个元素的值作为 BIT 存储在数据库中,并尝试将它们关联起来,以便它们被选中或不选中。我有一个尝试枚举所有切换按钮的想法,但无法做到这一点;

System.Windows.Controls.Primitives.ToggleButton [24] fudge = 
   new System.Windows.Controls.Primitives.ToggleButton [24];
   fudge[0] = thetime0000;
   fudge[1] = thetime0100;

我可以通过元素名称或编号直接调用元素吗?有什么想法吗?

【问题讨论】:

    标签: .net wpf c#-4.0


    【解决方案1】:

    您可以按名称访问控件:

    thetime0000.IsChecked = true;
    

    【讨论】:

      【解决方案2】:

      创建以下内容:

      水平列表视图:

      <ListView ItemsSource="{Binding myClocks}"> 
          <ListView.ItemsPanel>  
              <ItemsPanelTemplate>  
                  <VirtualizingStackPanel Orientation="Horizontal" />  
              </ItemsPanelTemplate>  
          </ListView.ItemsPanel>  
          <ListView.ItemTemplate>
              <DataTemplate>
                  <ToggleButton />
              </DataTemplate>
          </ListView.ItemTemplate>      
      </ListView> 
      

      一个包含两个成员 TimeIsChecked 的类:

      Class MyClock : INotifyPropertyChanged
      {
          public event PropertyChangedEventHandler PropertyChanged;
          string time;
          Nullable<bool> isChecked;
          public string Time 
          { 
              get { return time }; 
              set
              {
                  time = value;
                  OnPropertyChanged("Time");
              }
          };
          // Similarly create property for isChecked        
          protected void OnPropertyChanged(string name)
          {
              PropertyChangedEventHandler handler = PropertyChanged;
              if (handler != null)
              {
                  handler(this, new PropertyChangedEventArgs(name));
              }
          } 
      }
      

      更多详情请关注implementing property change notification see here

      包含 MyClock 实例列表的 ObservableCollection:

      ObservableCollection<MyClock> myClocks = new ObservableCollection<MyClock>();
      

      将 24 项添加到集合中:

      for(int i=0; i<24; i++)
          myClocks.Add(new MyClock{ Time = String.Format("00:{0}",i.ToString("D2"}), IsChecked = false });
      

      您的 ListView 的 ItemsSource 已设置为标记中的 ObservableCollection(见上文)

      希望您已经设置了 DataContext。

      现在,每当用户单击 ToggleButton 时,值 True/False/Null 都会传播到您的属性,反之亦然。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-10
        • 1970-01-01
        • 2020-11-10
        • 1970-01-01
        • 2015-03-30
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多