通过变量名称访问和更改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>
含有类中的两个成员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(参见上文)
希望您已经设置了DataC ontext。
现在每当用户点击ToggleButton时,值True/False/Null将会传播到您的属性,反之亦然。
答
可以按名称访问控制:
thetime0000.IsChecked = true;