【问题标题】:How to pass reference of a xaml element with event triggered by another element?如何通过另一个元素触发的事件传递 xaml 元素的引用?
【发布时间】:2019-11-02 06:34:00
【问题描述】:

我有一个设备列表,用户将在该列表中选择哪个 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 进行验证。
我想要这样当点击ButtonTextBlockx:Name(或另一种引用方式)被传递给Port_selected 函数,这样我就可以在调用TextBox.Name 时获得正确的设备在发件人上。

我可以为这些按钮中的每一个单独的x:Name 和一个字典来匹配哪个按钮匹配哪个TextBlock 和哪个StackPanel,但我想知道如何在没有这种解决方法的情况下做。现在我只是去掉Buttonx:Name的最后一个字符...

【问题讨论】:

  • 您可以将 Button 的 Command 属性绑定到视图模型中的 ICommand 属性,并将 Button 的 CommandParameter 属性绑定到其他一些 XAML 元素,而不是附加 Click 事件处理程序然后作为参数传递给命令的 CanExecute 和 Execute 方法。例如。喜欢这里:stackoverflow.com/q/12371253/1136211

标签: c# wpf xaml binding


【解决方案1】:

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

如果您熟悉 MVVM 设计模式,则有更好的方法来解决这个问题,例如使用命令和命令参数,但考虑到您当前的设置,最简单的解决方案可能是在事件中获取对 TextBlock 的引用handler,然后获取其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;
            //...
        }
    }
}

【讨论】:

  • 谢谢mm8,第n次用好的解决方案帮我解决了。我从来不知道如何在代码中向上导航 xaml 树,所以感谢这个方法。
猜你喜欢
  • 2012-10-17
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多