Как в C # передать имя объекта в качестве параметра функции? - PullRequest
0 голосов
/ 07 декабря 2009

У меня есть код, который изменяет состояние логического свойства при щелчке мышью, в зависимости от имени объекта, по которому щелкнули:

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;
    }

Пожалуйста, поправьте меня. Что я делаю не так?

Ответы [ 4 ]

2 голосов
/ 07 декабря 2009

Вы хотите получить доступ к элементу управления по его имени. Следующий код предполагает, что ваш элемент управления является «RadioButton», а ваш код находится в форме.

    public void ChangeSelection(string name)
    {
        if (this.Controls.ContainsKey(name))
        {
            RadioButton radio1 = this.Controls[name] as RadioButton;
            radio1.IsSelected = !radio1.IsSelected;
        }
    }
2 голосов
/ 07 декабря 2009

Возможно, вы просто захотите сохранить целевую ссылку в свойстве «тег» каждого элемента. Тогда у вас не будет всех волшебных струн для прохождения.

2 голосов
/ 07 декабря 2009

Я не удивительный в WPF, но я думаю, что вы хотите вместо этого передать feSource в ChangeSelection. Затем приведите его к «реальному» типу, будь то CheckBox или что-то еще, а затем измените свойство .IsSelected.

Я понятия не имею, почему вы захотите сделать это по имени, когда вы получите реальный объект в качестве параметра (отправителя объекта).

1 голос
/ 07 декабря 2009

То, что вы передаете своей функции - это строка. Поэтому, когда вы пытаетесь обратиться к name.IsSelected в своей функции, вы ищете метод String.IsSelected (существует ли?)

Где вы объявляете r1s1 и r1s3 в вашей главной функции? Это объекты, которые вы должны пытаться вызвать. Выбрано.

И синтаксический комментарий сахара:

public void ChangeSelection(string name)
{
   // resolve object from name here
   feObject.IsSelected = ! feObject.IsSelected;
}
...