C # приведение строки к объекту - PullRequest
2 голосов
/ 06 января 2010

В приложении WPF у меня есть объекты, полученные из пользовательского элемента управления:

...
<MyNamespace:MyCustControl x:Name="x4y3" />
<MyNamespace:MyCustControl x:Name="x4y4" />
... 

Я могу ссылаться на эти объекты, используя имена:

x4y4.IsSelected = true;

Также хорошо работает такая функция:

 public void StControls(MyCustControl sname)
    {
     ...          
        sname.IsSelected = true;
     ...
    }

....

 StControls(x4y3);

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

        MyCustControl sc = new MyCustControl();
        string strSc = "x1y10";
        sc.Name = strSc;

        StControls(sc); // nothing's happening

И этот способ даже не компилируется:

        MyCustControl sc = new MyCustControl();
        string strSc = "x1y10";
        sc = (MyCustControl) strSc; // Cannot convert type string to MyCustControl 

        StControls(sc); 

Как я могу использовать переменную string для манипулирования объектом (то есть приведение к объекту)?

Ответы [ 2 ]

9 голосов
/ 06 января 2010

Использование FindName: -

 MyCustControl sc = (MyCustControl)this.FindName("x1y10");

Когда вы используете x: Name в XAML, поле с указанным именем создается в частичном классе, который соответствует классу в коде cs. В этом частичном классе находится реализация InitialiseComponent. Во время выполнения этого метода объект с таким именем обнаруживается и присваивается полю, для этого используется FindName.

Если у вас есть строка, содержащая такое имя, вы можете просто вызвать FindName самостоятельно, а затем привести возвращаемый объект к пользовательскому типу элемента управления.

5 голосов
/ 06 января 2010

Это на самом деле не кастинг. Вам нужно найти ссылку на объект для элемента управления по имени, что можно сделать так:

MyCustControl control = (MyCustControl)frameworkElement.FindName("x4y3");

Где frameworkElement - содержащее окно (или любая панель, подобная сетке). Из кода за окном, использование this должно работать:)

См. Также этот вопрос , если вы планируете вместо этого динамически создавать элементы управления, что, как мне кажется, предлагает ваша схема именования Однако, если это так, FindName на самом деле совсем не нужен. Вы бы просто сохраняли ссылки на все созданные элементы управления в двумерном массиве по мере их создания.

int[,] controls = new int[10, 10];

for (int x = 0; x < 10; x++)
{
    for (int y = 0; y < 10; y++)
    {
        // Create new control and initialize it by whatever means
        MyCustControl control = new MyCustControl();

        // Add new control to the container       
        Children.Add(control);

        // Store control reference in the array
        controls[x, y] = control;
    }
}

Затем, позже, вы можете просто получить доступ к элементу управления следующим образом:

controls[4, 3].IsSelected = true;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...