代码之家  ›  专栏  ›  技术社区  ›  wonea Ilya Smagin

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

  •  0
  • wonea Ilya Smagin  · 技术社区  · 14 年前

    我有一系列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" />
    

    等。

    现在,我将每个元素的值存储在一个数据库中,并尝试将它们关联起来,以便选择或不选择它们。我有一个想法,试图枚举所有的切换按钮,但不能走那么远;

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

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

    2 回复  |  直到 14 年前
        1
  •  0
  •   Amsakanna    14 年前

    创建以下内容:

    水平列表视图:

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

    包含两个成员的类 Time IsChecked :

    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将传播到您的属性,反之亦然。

        2
  •  1
  •   PMN    14 年前

    可以按名称访问控件:

    thetime0000.IsChecked = true;