UWP - команда из DataGrid не вызывается - PullRequest
1 голос
/ 26 апреля 2020

Приложение UWP (важно, потому что нет AncestorType) Я не могу связать команду (и другие значения) ViewModel из DataGridTemplateColumn. Вот мой текущий код (я пробовал, буквально все)

          <controls:DataGrid
            x:Name="DataGrid" 
            Grid.Row="2"
            Height="Auto" 
            Margin="12"
            AutoGenerateColumns="False"
            HorizontalContentAlignment="Center"
            ItemsSource="{Binding ProviderOrders}">
             <controls:DataGrid.Columns>
                <controls:DataGridTemplateColumn Header="Actions" Width="*">
                    <controls:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button Content="Modifier" Command="{Binding DataContext.EditOrderCommand, RelativeSource={RelativeSource Mode=Self}}" CommandParameter="{Binding}" Style="{StaticResource PrimaryButton}"/>
                        </DataTemplate>
                    </controls:DataGridTemplateColumn.CellTemplate>
                </controls:DataGridTemplateColumn>
            </controls:DataGrid.Columns>
        </controls:DataGrid>

Я также пытался

<Button Content="Modifier" Command="{Binding ElementName=DataGrid, Path=DataContext.EditOrderCommand}" CommandParameter="{Binding}" Style="{StaticResource PrimaryButton}"/>

Нет ошибки, но моя команда не выполняется, и моя команда работает если я переместил кнопку за пределы DataGrid ..

DataGridTemplateColumn DataContext является объектом ProviderOrder, и поэтому мне необходим доступ к ViewModel (который, очевидно, недоступен из объекта ProviderOrder)

Спасибо заранее:)

1 Ответ

1 голос
/ 27 апреля 2020

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

public class Item
{
    public string ID { get; set; }
    public ICommand BtnCommand
    {
        get
        {
            return new CommadEventHandler<Item>((s) => BtnClick(s));
        }
    }

    private void BtnClick(Item s)
    {

    }
}

Код Xaml

<controls:DataGridTemplateColumn>
    <controls:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button
                Command="{Binding BtnCommand}"
                Content="Click"
                />
        </DataTemplate>
    </controls:DataGridTemplateColumn.CellTemplate>
</controls:DataGridTemplateColumn>

Обновление

Если не указано c DataGrid, вы можете использовать listview для замены, и Binding ElementName будет работать.

...