Как мне вызвать кнопку Button из ListBox.ItemTemplate DataTemplate, чтобы передать параметр без выбора элемента ListBox? - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть проблема, с которой я сталкиваюсь уже несколько часов.Внутри моего представления xaml у меня есть ListBox, который определяет DataTemplate следующим образом:

<DataTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height ="30"/>
                            <RowDefinition Height ="30"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>

                        <!--Row 0-->
                        <TextBlock Grid.Column="0"
                                       Grid.Row="0"
                                       Style="{StaticResource racetblk}">
                                    Horse name
                        </TextBlock>
                        <TextBlock Grid.Column="1"
                                       Grid.Row="0"
                                       Style="{StaticResource racetblk}">
                                    Horse DOB
                        </TextBlock>

                        <!--Row 1-->
                        <StackPanel Orientation="Horizontal"
                                    Grid.Row="1"
                                    Grid.Column="0">
                            <TextBox Text="{Binding Path=HorseName, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"
                                 Style="{StaticResource tableItem}"
                                 Height="20"
                                     Width="150"/>
                            <Button Width="50"
                                Margin="5"
                                Height="20"
                                Content="Pick"
                                Background=" #a1c883 "
                                Foreground="White"
                                Command="{Binding PickHorseDataCommand}"
                                CommandParameter="{Binding ElementName=lbHorseList, Path=SelectedIndex}"/>
                        </StackPanel>
                        <TextBox Text="{Binding Path=Birth, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"
                                 Grid.Row="1"
                                 Grid.Column="1"
                                 Style="{StaticResource tableItem}"
                                 Height="20"/>
                    </Grid>

                </DataTemplate>

Внутри шаблона <!--Row 1--> У меня есть кнопка, которая должна вызывать команду внутри моегоПредполагается, что команда ViewModel запускается после ввода текста внутри TextBox:

private ICommand pickHorseDataCommand;
        public ICommand PickHorseDataCommand
        {
            get
            {
                if (pickHorseDataCommand == null)
                    pickHorseDataCommand = new RelayCommand(
                    o =>
                    {
                        int horseIndex = (int)o;
                        HorseDataWrapper horse = Horses[horseIndex];
                        LoadedHorse horseFromList = allHorses.Where(i => i.Name == horse.HorseName).FirstOrDefault();
                        horse.Birth = horseFromList.Birth.ToString();
                        var dupa = horse;
                    });
                return pickHorseDataCommand;
            }
        }

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

Другое дело, чтоCommandParameter привязан к SelectedIndex, поэтому при нажатии кнопки необходимо выбрать элемент ListBox, чтобы привязка осуществилась.Я не мог найти другое решение, чтобы сделать привязку без выбора элемента.Может быть, у вас есть альтернативы?

Я ценю ваше время и помощь.

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

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

Command="{Binding DataContext.PickHorseDataCommand, RelativeSource={RelativeSource AncestorType=ListBox}}"

Если вам требуется SelectedIndex в модели представления, вы должны определить исходное свойство и привязать к нему свойство ListBox SelectedIndex вместо использования CommandParameter:

<ListBox SelectedIndex="{Binding YourIndexProperty}" ... />

Метод команды Execute может затем напрямую обращаться к свойству index:

int index = this.YourIndexProperty;

Другим вариантом может быть передача ссылки на сам текущий элемент вместо использования индекса в качестве параметра команды:

CommandParameter="{Binding}"
0 голосов
/ 30 апреля 2019

Вы можете сделать что-то вроде этого, необходимо указать AncestorType

Command="{Binding DataContext.pickHorseDataCommand,RelativeSource={RelativeSource AncestorType=,Mode=FindAncestor}}"

...