В UWP, как иметь кнопку действия внутри ItemRepeater?

#c# #data-binding #uwp #uwp-xaml #winui

#c# #привязка к данным #uwp #uwp-xaml #winui

Вопрос:

У меня проблема с размещением кнопки действия в моем ItemRepeater. Я действовал так же, как и в ListView :

 <muxc:ItemsRepeater Margin="0,24,0,0" ItemsSource="{x:Bind ViewModel.Team.Events, Mode=OneWay}">
        <muxc:ItemsRepeater.ItemTemplate>
              <DataTemplate x:DataType="models:Event">
              <controls:Expander
                                        HorizontalContentAlignment="Left"
                                        Header="{x:Bind Name, Mode=OneWay}"
                                        ExpandDirection="Down"
                                    >
                                        <StackPanel HorizontalAlignment="Left" Padding="24">
                                            <TextBlock Text="{x:Bind Name}" FontSize="36" />
                                            <TextBlock Text="{x:Bind Description}" />
                                            <StackPanel Spacing="4" Orientation="Horizontal">
                                                <TextBlock Text="{x:Bind Start}" />
                                                <TextBlock Text="-" />
                                                <TextBlock Text="{x:Bind End}" />
                                            </StackPanel>

                                            <TextBlock Text="{x:Bind Type}" />
                                            <Grid Width="1000" Margin="0,24,0,0">
                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="13*" />
                                                    <ColumnDefinition Width="*" />
                                                    <ColumnDefinition Width="13*" />
                                                </Grid.ColumnDefinitions>
                                                <StackPanel Grid.Column="0">
                                                    <TextBlock FontSize="24" Text="Participations" />
                                                    <ListView ItemsSource="{x:Bind Participations}">
                                                        <ListView.ItemContainerStyle>
                                                            <Style TargetType="ListViewItem">
                                                                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                                                            </Style>
                                                        </ListView.ItemContainerStyle>
                                                        <ListView.ItemTemplate>
                                                            <DataTemplate x:DataType="models:Participation">
                                                                <Grid>
                                                                    <Grid.ColumnDefinitions>
                                                                        <ColumnDefinition Width="9*" />
                                                                        <ColumnDefinition Width="1*" />
                                                                    </Grid.ColumnDefinitions>
                                                                    <TextBlock Text="{x:Bind Username}" />
                                                                    <FontIcon Grid.Column="1" Glyph="{x:Bind Confirmed, Converter={StaticResource BooleanIconConverter}}"></FontIcon>

                                                                </Grid>
                                                            </DataTemplate>
                                                        </ListView.ItemTemplate>
                                                    </ListView>
                                                </StackPanel>

                                                <StackPanel Grid.Column="2">
                                                    <TextBlock FontSize="24" Text="Discrepancies" />
                                                    <Grid Margin="8">
                                                        <Grid.ColumnDefinitions>
                                                            <ColumnDefinition Width="1*" />
                                                            <ColumnDefinition Width="1*" />
                                                            <ColumnDefinition Width="2*" />
                                                            <ColumnDefinition Width="1*" />
                                                            <ColumnDefinition Width="1*" />
                                                        </Grid.ColumnDefinitions>
                                                        <TextBlock Text="Player" />
                                                        <TextBlock Text="Type" Grid.Column="1"/>
                                                        <TextBlock Text="Reason" Grid.Column="2"/>
                                                        <TextBlock Text="Delay" Grid.Column="3"/>
                                                    </Grid>
                                                    <ListView ItemsSource="{x:Bind Discrepancies}">
                                                        <ListView.ItemContainerStyle>
                                                            <Style TargetType="ListViewItem">
                                                                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                                                            </Style>
                                                        </ListView.ItemContainerStyle>
                                                        <ListView.ItemTemplate>
                                                            <DataTemplate x:DataType="models:Discrepancy">
                                                                <Grid>
                                                                    <Grid.ColumnDefinitions>
                                                                        <ColumnDefinition Width="1*" />
                                                                        <ColumnDefinition Width="1*" />
                                                                        <ColumnDefinition Width="2*" />
                                                                        <ColumnDefinition Width="1*" />
                                                                        <ColumnDefinition Width="1*" />
                                                                    </Grid.ColumnDefinitions>
                                                                    <TextBlock Text="{x:Bind Username}" />
                                                                    <TextBlock Text="{x:Bind Type}" Grid.Column="1"/>
                                                                    <TextBlock Text="{x:Bind Reason}" Grid.Column="2"/>
                                                                    <TextBlock Text="{x:Bind DelayLength}" Grid.Column="3"/>
                                                                    <Button Grid.Column="4" HorizontalAlignment="Right">
                                                                        <Button.Flyout>
                                                                            <Flyout>
                                                                                <StackPanel>
                                                                                    <TextBlock Style="{ThemeResource BaseTextBlockStyle}" Text="Are you sure ?" Margin="0,0,0,12" />
                                                                                    <Button Click="DeleteDiscrepancy" Content="Yes" />
                                                                                </StackPanel>
                                                                            </Flyout>
                                                                        </Button.Flyout>

                                                                        <StackPanel Spacing="8" Orientation="Horizontal">
                                                                            <FontIcon Glyph="amp;#xE74D;" />
                                                                        </StackPanel>
                                                                    </Button>
                                                                </Grid>
                                                            </DataTemplate>
                                                        </ListView.ItemTemplate>
                                                    </ListView>
                                                </StackPanel>
                                            </Grid>
                                            <StackPanel Spacing="16" Orientation="Horizontal" FlowDirection="RightToLeft">
                                                <Button Click="HandleClickAddDiscrepancy">
                                                    <StackPanel Spacing="8" Orientation="Horizontal">
                                                        <TextBlock Text="Add Discrepancy"></TextBlock>
                                                        <FontIcon Glyph="amp;#xE710;"/>
                                                    </StackPanel>
                                                </Button>
                                                <Button>
                                                    <StackPanel Spacing="8" Orientation="Horizontal">
                                                        <TextBlock Text="Edit Event"></TextBlock>
                                                        <FontIcon Glyph="amp;#xE70F;"/>
                                                    </StackPanel>
                                                </Button>
                                                <Button>
                                                    <StackPanel Spacing="8" Orientation="Horizontal">
                                                        <TextBlock Text="Delete Event"></TextBlock>
                                                        <FontIcon Glyph="amp;#xE74D;"/>
                                                    </StackPanel>
                                                </Button>
                                            </StackPanel>
                                        </StackPanel>

                                    </controls:Expander>
              </DataTemplate>
         </muxc:ItemsRepeater.ItemTemplate>
</muxc:ItemsRepeater>
  

И в моем коде-за :

         private void HandleClickAddDiscrepancy(object sender, RoutedEventArgs e) {
            var evt = (sender as Button)?.DataContext as Event;
            if(ViewModel.AddDiscrepancyCommand.CanExecute(evt)) {
                ViewModel.AddDiscrepancyCommand.Execute(evt);
            }
        }
  

Но в этом кодовом методе DataContext моей кнопки равен null. Разве это не должен быть текущий элемент списка, в каком разделе находится кнопка, на которую я нажал?
Как мне следует приступить к реализации такой функции?
Заранее спасибо!

Комментарии:

1. Я пробовал это, и контекст данных был установлен в моем приложении. Является ли кнопка корнем шаблона? Можете ли вы проверить, не равен ли DataContext нулю, прежде чем использовать его?

2. Нет, кнопка не является корнем шаблона, но когда я делаю то же самое с ListView, это работает

3. Просто попробовал это с более сложными шаблонами, DataContext отлично работает для меня. Может ли быть так, что as возвращает null для вас? Можете ли вы поделиться полным шаблоном, немного сложно объяснить, в чем проблема с этим фрагментом.

4. Не думаю, что это так, as поскольку, когда я выполняю отладку для проверки sender переменной, ее DataContext равен нулю. Спасибо, что попытались на вашей стороне, я загружу полную разметку

5. Правильно ли работает точно такая же разметка внутри ListView? Можете ли вы попробовать заменить элемент управления expander чем-то другим? Кажется, что datacontext неправильно распространяется вниз. Если это так, вы можете вручную привязать datacontext вашей кнопки, чтобы исправить это.