如何通过另一个元素触发的事件传递对xaml元素的引用?

时间:2019-06-19 13:36:53

标签: c# wpf xaml binding

我有一个设备列表,用户将在列表中选择代表哪个设备的COM端口,每个设备都有其自己的StackPanel,如下所示:

<StackPanel Orientation="Horizontal" Margin="5">
    <TextBlock Width="140"  Text="IMT" VerticalAlignment="Center"/>
    <ComboBox Width="250" Margin="0,0,40,0" x:Name="FM_list" SelectionChanged="DeviceSelected"/>
    <TextBlock x:Name="FM_selection" Margin="0,0,40,0" Width="80 "/>
    <Button Background="Red" Width="50" Click="Port_selected" x:Name="FM_selection1"/>
</StackPanel>

用户在ComboBox中进行选择后,可以通过单击相邻的Button进行验证。
我想要这样,以便在单击Button中的x:Name(或另一种引用方式)的TextBlock时将其传递给Port_selected函数,这样我就可以在发件人上呼叫TextBox.Name时使用正确的设备。

我可以为每个按钮和字典分别设置x:Name和一个字典,以匹配哪个按钮与哪个TextBlock和哪个StackPanel匹配,但是我想知道如何不使用解决方法。现在,我只剥离了Button的{​​{1}} ...的最后一个字符...

1 个答案:

答案 0 :(得分:0)

Port_selected是事件处理程序,您不能将string值传递给该事件处理程序。

如果您熟悉MVVM设计模式,则有更好的方法来解决此问题,例如使用命令和命令参数,但是在当前设置下,最简单的解决方案可能是在Windows中获取TextBlock的引用。事件处理程序,然后获取其Name属性的值,例如:

private void Port_selected(object sender, RoutedEventArgs e)
{
    Button btn = (Button)sender;
    StackPanel stackPanel = btn.Parent as StackPanel;
    if (stackPanel != null)
    {
        TextBlock textBlock = stackPanel.Children
            .OfType<TextBlock>()
            .FirstOrDefault(x => !string.IsNullOrEmpty(x.Name));
        if (textBlock != null)
        {
            string name = textBlock.Name;
            //...
        }
    }
}