【问题标题】:Binding Property in command parameter (datagrid)命令参数中的绑定属性(数据网格)
【发布时间】:2020-08-02 01:12:20
【问题描述】:

我有一个数据网格,列出了可观察集合中存在的信息。到目前为止一切正常。

然后我想添加一个停止命令,其中 Name 属性作为参数,但是当我写 CommandParameter= {Binding Name} 时,我的按钮被禁用。 我尝试使用随机字符串设置 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>

谢谢!

【问题讨论】:

  • StopCommand 是如何实现的?你管理CanExecute 方法了吗?很可能您的按钮已禁用,因为它返回 false

标签: c# .net wpf mvvm data-binding


【解决方案1】:

我认为这个问题出在您的代码隐藏代码中。我为您创建了一个示例,在此示例中,我使用的是您的 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);
}

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 2012-01-29
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 2011-01-07
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多