通过变量名称访问和更改WPF元素

问题描述:

我有一系列标记为24小时制的按钮。例如;通过变量名称访问和更改WPF元素

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

现在我每个元素的值存储在数据库中作为了一下,我想给他们,让他们选择或不相关联。我有一个想法,想枚举所有的切换按钮,但不能达到那么远;

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

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

创建以下文件:

一个水平的ListView:

<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(参见上文)

希望您已经设置了DataC ontext。

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

可以按名称访问控制:

thetime0000.IsChecked = true;