我有一个看起来像这样的结构:
public struct ChannelSettings
{
public double slider20Hz;
public double slider25Hz;
public double slider31_5Hz;
public double slider40Hz;
}
当滑块值改变如下时,我正在遍历我的用户界面对象:
foreach (Slider slider in grdEqSliders.Children)
{
// slidername = slider.Name;
switch(currentChannel)
{
case 1:
// Assign to channel.slidername
break;
case 2:
// Assign to channel.slidername
break;
default:
break;
}
}
我的问题是,有没有办法让我获得滑块名称,然后将其转换为我可以在我的结构中直接引用的内容?
例如,我想将slider.Name = "slider_20Hz"
转换为我在结构中使用的变量slider20Hz
。
答案 0 :(得分:5)
实现这一目标的唯一方法是将struct
定义为现在使用反射 - 虽然非常混乱。
替代方案 - 更改定义 - 是将值存储在字典中:
public class ChannelSettings {
Dictionary<string, double> _values = new Dictionary<string, double>();
public double slider20Hz {
get {
return GetByName("slider20Hz");
}
set {
_values["slider20Hz"] = value;
}
}
. . .
public void SetByName(string name, double value) {
_values[name] = value;
}
public double GetByName(string name) {
double v;
if (_values.TryGetValue("slider20Hz", out v)) {
return v;
}
return 0.0; // Default value
}
}
然后设置一个给定名称的值,你可以写:
channel.SetByName(slider.Name, . . . )
并获得一个值:
channel.GetByName(slider.Name)
答案 1 :(得分:1)
Slider控件,与所有FrameworkElements一样,具有Tag属性,适用于您需要属性供自己使用的这些类型的情况。
<Slider Tag="slider_20Hz"/>
foreach (Slider slider in grdEqSliders.Children)
{
slidername = slider.Tag as string;
...
}