我有一些代码可以在mouseclick上改变boolean属性的状态,具体取决于被点击对象的名称:
private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
FrameworkElement feSource = e.Source as FrameworkElement;
switch (feSource.Name)
{
case "r1s1":
if (r1s1.IsSelected == false)
r1s1.IsSelected = true;
else
r1s1.IsSelected = false;
break;
case "r1s2":
if (r1s2.IsSelected == false)
r1s2.IsSelected = true;
else
r1s2.IsSelected = false;
break;
.............
}
e.Handled = true;
}
我想做同样的操作,将发送者的名称(r1s1,r1s2,..等)作为参数来运行,此字符串与属性名称(IsSelected)结合,只是为了优化代码。这样的事情(只是想法):
private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
FrameworkElement feSource = e.Source as FrameworkElement;
ChangeSelection (feSource.Name)
}
public void ChangeSelection(string name)
{
if (name.IsSelected == false)
name.IsSelected = true;
else
name.IsSelected = false;
}
拜托,纠正我。我做错了什么?
答案 0 :(得分:2)
我在WPF上并不出色,但我相信您希望将feSource传递给ChangeSelection。然后将它转换为它的“真实”类型,是这个CheckBox或其他任何东西,然后修改它上面的.IsSelected属性。
当你将真实对象作为参数(对象发送者)时,我不知道你为什么要这样做。
答案 1 :(得分:2)
您可能只想将目标引用存储在每个项目的“tag”属性中。那么你就不会有所有魔法字符串传递。
答案 2 :(得分:2)
您希望按名称访问控件。以下代码假定您的控件是“RadioButton”,并且您的代码位于表单上。
public void ChangeSelection(string name)
{
if (this.Controls.ContainsKey(name))
{
RadioButton radio1 = this.Controls[name] as RadioButton;
radio1.IsSelected = !radio1.IsSelected;
}
}
答案 3 :(得分:1)
您传递给函数的是一个字符串。因此,当您尝试在函数中寻址name.IsSelected时,您正在寻找String.IsSelected方法(是否存在?)
你在top函数中声明r1s1和r1s3的位置?这些是您应该尝试调用的对象.IsSelected on。
语法糖评论:
public void ChangeSelection(string name)
{
// resolve object from name here
feObject.IsSelected = ! feObject.IsSelected;
}