Получить объект строки ListBox от кнопки, которая находится на DataTemplate - PullRequest
2 голосов
/ 24 января 2010

У меня есть ListBox с DataTemplate. Шаблон имеет Button на нем. Когда нажата кнопка Button, я хочу сделать некоторую логику с объектом, который является каждой строкой (в данном случае это объект с именем WorkItemTypeMappings).

В OnClick как я могу перейти от Button (object sender) к объекту, который является строкой, на которой находится кнопка?

Вот XAML моего ListBox:

<ListBox ItemsSource="{Binding Source={StaticResource WorkItemTypeMappingsCollectionView}}" HorizontalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Name="lstWITypes">
    <ListBox.GroupStyle>
        <x:Static Member="GroupStyle.Default"/>
    </ListBox.GroupStyle>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid HorizontalAlignment="Stretch">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="2*"/>
                    <ColumnDefinition Width="2*"/>
                    <ColumnDefinition Width="50"/>
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding SourceType, Converter={StaticResource WorkItemTypeToStringConverter}}"/>
                <ComboBox Grid.Column="1" SelectedItem="{Binding DestType}" ItemsSource="{Binding WorkItemTypesForCurrentDestProject, Source={x:Static loc:MainMediator.Instance}, diagnostics:PresentationTraceSources.TraceLevel=High}" DisplayMemberPath="Name" />

                <!-- This is the button-->
                <Button Grid.Column="2" Content="{Binding PercentMapped}" 
                        Click="ManualMappingClick"/>
            </Grid>
        </DataTemplate>                                        
    </ListBox.ItemTemplate>
</ListBox>

Ответы [ 4 ]

2 голосов
/ 25 января 2010

В качестве альтернативы вы можете использовать команду вместо события. Если вы привяжете свою кнопку к команде и передадите вместе с ней параметр команды, вы сможете получить элемент, связанный с этой кнопкой. Пример кода:

<!-- This is the button-->
 <Button
     Grid.Column="2"
     Content="{Binding PercentMapped}" 
     Command="SolutionNamespace:CommandClass.ButtonClickedCommand"
     CommandParameter="{Binding}" />

Я не уверен, насколько вы знакомы с командным WPF, но вы заметите, что CommandParameter привязывается к контексту без имени пути, то есть он связывается с необходимыми WorkItemTypeMappings.

Пример кода команды:

public static SimpleCommand ButtonClickedCommand { get; set; }

static CommandClass()
{
    ButtonClickedCommand = new SimpleCommand
                           {
                               ExecuteDelegate =
                               x=> ButtonClicked(x as WorkItemTypeMappings)
                           };
}


public static ButtonClicked(WorkItemTypeMappings mappings)
{
    if(mappings != null) MessageBox.Show(mapping.PercentMapped)
}

Вы заметите, что ButtonClickedCommand является статическим, это необходимо, потому что кнопка не может получить доступ к команде из текущего контекста привязки.

SimpleCommand - это просто упрощенная реализация ICommand, можете Google эту, если вы не уверены. Я надеюсь, что это не излишняя проблема, но вы не ошибетесь с командами WPF.

Удачи.

1 голос
/ 24 января 2010

Попробуйте использовать VisualTreeHelper, чтобы найти родительский ListBoxItem для кнопки. Несколько хороших общих универсальных вспомогательных функций можно найти здесь:

Как найти элементы управления WPF по имени или типу?

так, например, вы можете найти ListBoxItem из события click с помощью вызова, подобного этому:

ListBoxItem item = UIHelper.FindVisualParent<ListBoxItem>(sender);
0 голосов
/ 24 января 2010

Кроме того, если у вас уже есть ссылка на ListBoxControl, и у вас также есть элемент данных, представляющий строку (я полагаю, так как у вас есть привязка, и, таким образом, вы можете перетащить ее из DataContext на кнопке), можно спросить у ItemsContainerGenerator. ContainerFromItem , чтобы дать вам фактический UIElement для строки.

Itemcontainergenerator можно найти как свойство в самом списке. (технически элемент itemscontrol, так как он определен)

0 голосов
/ 24 января 2010

вы пробовали ListBox.SelectedItem?

...