如果在运行时之前不知道对象的名称,如何引用对象的属性?

时间:2018-04-25 19:20:33

标签: c# wpf xaml

我正在开发一个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>

正如你所看到的,我真的想要一个单击&#34;点击&#34;处理所有三个按钮的方法。我希望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),然后连接前缀和&#34; Textbox&#34;获取文本框的名称我想要将数据放入。

最后一行显然不起作用,因为tbName是一个字符串,它没有&#34; Text&#34;属性。但是,我知道在运行时,文本框对象的名称将包含在tbName变量中。有没有办法实现我想做的事情?我知道我显然可以为每个按钮创建单独的方法,但如果可能的话,我宁愿避免使用它。

由于

1 个答案:

答案 0 :(得分:1)

你应该学习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";
}

这只是空中代码,可能有拼写错误。