Свойство привязки в параметре команды (сетка данных) - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть сетка данных, которая перечисляет информацию, присутствующую в наблюдаемой коллекции. Пока все работает нормально.

Затем я хотел бы добавить команду останова, свойство Name в качестве параметра, но когда я пишу CommandParameter = {Имя привязки}, моя кнопка отключается. Я пытаюсь установить CommandParameter со случайной строкой, и это работает, поэтому проблема связана с привязкой.

        <DataGrid.Columns>


            <DataGridTextColumn Header="Name" Binding="{ Binding Name }"/>
            <DataGridTextColumn Header="Source" Binding="{ Binding Source }"/>
            <DataGridTextColumn Header="Target" Binding="{ Binding Target }"/>

            <DataGridTemplateColumn Header="Stop">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="Stop" 
                                Command="{ Binding DataContext.StopCommand, RelativeSource = { RelativeSource FindAncestor,AncestorType={ x:Type DataGrid } } }"                         
                                CommandParameter="{ Binding Name }"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

Спасибо вам!

1 Ответ

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

Я думаю, что эта проблема в вашем коде позади кода. Я создал для вас пример, и в этом примере я использую ваш код XAML.

В этом примере я использую Prism.WPF пакет NuGet.

XAML код:

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
        <DataGridTextColumn Header="Source" Binding="{Binding Source}"/>
        <DataGridTextColumn Header="Target" Binding="{Binding Target}"/>
        <DataGridTemplateColumn Header="Stop">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Content="Stop" 
                            Command="{Binding DataContext.StopCommand, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGrid}}}"                         
                            CommandParameter="{Binding Name}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        </DataGrid.Columns>
</DataGrid>

Кодовый код:

public partial class MainWindow : MetroWindow
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new FooViewModel();
    }
}

public class Foo
{
    public string Name { get; set; }
}

public class FooViewModel : BindableBase
{
    public FooViewModel()
    {
        for (int i = 0; i < 100; i++) Items.Add(new Foo() { Name = $"name_{i}" });
        StopCommand = new DelegateCommand<string>(OnStopCommand);
    }

    public ICommand StopCommand { get; private set; }
    public ObservableCollection<Foo> Items { get; set; } = new ObservableCollection<Foo>();

    private void OnStopCommand(string name) => Console.WriteLine(name);
}
...