Как передать ссылку на элемент xaml с событием, вызванным другим элементом? - PullRequest
0 голосов
/ 19 июня 2019

У меня есть список устройств, и в этом списке пользователь будет выбирать, какой 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 'x:Name ...

1 Ответ

0 голосов
/ 19 июня 2019

Port_selected является обработчиком событий, и вы не можете передать ему значение string.

Если вы знакомы с шаблоном проектирования MVVM, есть более эффективные способы решения этой проблемы, например, с помощью команди параметры команды, но самое простое решение, учитывая ваши текущие настройки, - это, вероятно, получить ссылку на 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;
            //...
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...