Как ссылаться на свойства объекта, если вы не будете знать имя объекта до времени выполнения? - PullRequest
0 голосов
/ 25 апреля 2018

Я работаю над проектом C # WPF. У меня есть несколько кнопок, которые я хочу сделать по сути одно и то же, но опубликовать результаты обратно в разные текстовые поля. Аналогично фрагменту кода xaml ниже:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <StackPanel Grid.Column="0">
        <TextBox x:Name="ATextbox"/>
        <TextBox x:Name="BTextbox"/>
        <TextBox x:Name="CTextbox"/>
    </StackPanel>
    <StackPanel Grid.Column="1">
        <Button x:Name="AButton" Click="Button_Click" Content="Foo" Grid.Column="1"/>
        <Button x:Name="BButton" Click="Button_Click" Content="Foo" Grid.Column="1"/>
        <Button x:Name="CButton" Click="Button_Click" Content="Foo" Grid.Column="1"/>
    </StackPanel>
</Grid>

Как вы можете видеть, мне бы очень хотелось иметь один метод "щелчка" для обработки всех трех кнопок. Я бы хотел, чтобы C # выглядел примерно так:

private void Button_Click(object sender, EventArgs e) 
{
    //Get the name of the button clicked
    DependencyObject dpsender = sender as DependencyObject;
    string name = dpsender.GetValue(FrameworkElement.NameProperty) as string;
    string subName = name.Substring(0, 1);
    string tbName = subName + "Textbox";
    string text = "Calculated text";

    tbName.Text = text;
}

По сути, я получаю название нажатой кнопки, беру префикс (A, B или C), затем объединяю префикс и «Textbox», чтобы получить имя текстового поля, в которое я хочу поместить данные.

Последняя строка, очевидно, не работает, потому что tbName является строкой, которая не имеет свойства "Text". Однако я знаю, что во время выполнения имя объекта Textbox будет содержаться в переменной tbName. Есть ли способ достичь того, что я пытаюсь сделать? Я знаю, что я мог бы создать отдельные методы для каждой кнопки, но я бы предпочел этого избежать, если это возможно.

Спасибо

1 Ответ

0 голосов
/ 25 апреля 2018

Ты должен выучить mvvm.

Тем временем злоупотребляйте тегом на ваших кнопках и привязывайте его к интересующему вас текстовому полю. Получите ссылку на них, вытащив его обратно.

Что-то вроде:

<Button x:Name="AButton" Tag="{Binding ElementName=ATextBox}"

и

private void Button_Click(object sender, EventArgs e) 
{
    //Get the name of the button clicked
    Button btn = sender as Button;
    ((TextBox)btn.Tag).Text = "Calculated text";
}

Это всего лишь воздушный код и может иметь опечатки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...