DataGrid绑定内的ListBox

时间:2018-06-24 11:51:16

标签: c# wpf xaml data-binding datagrid

我在XAML中绑定存在问题。我有一个DataGrid里面有一个按钮的ListBox。我需要将按钮的命令参数绑定到DataGrid的项目ID。我尝试使用RelativeSource,使用ID命名隐藏列,并尝试绑定列datacontext,但没有任何效果。我还尝试将其绑定到DataGrid中的SelectedItem,然后命令可以正常工作,但是CanExecute不能,因为每个按钮都是根据选定的行而不是实际所在的行进行更新的。 这是我的代码:

查看:

<DataGrid
    ItemsSource="{Binding Orders}"
    AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn  Header="Order date" Binding="{Binding OrderDate}" />
        <materialDesign:MaterialDataGridTextColumn Header="Status" Binding="{Binding Status}"/>
        <materialDesign:MaterialDataGridTextColumn Header="Last update" Binding="{Binding LastUpdate}"/>
        <materialDesign:MaterialDataGridTextColumn Header="Managed by" Binding="{Binding SomePerson}"/>
        <materialDesign:MaterialDataGridTextColumn Header="Number" Binding="{Binding SomeNumber}"/>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Content="{Binding ShowDetailsCommandViewModel.Name}" Command="{Binding ShowDetailsCommandViewModel.Command}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Actions">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ListBox ItemsSource="{Binding Actions}">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <Button Content="{Binding Name}" Command="{Binding Command}"
                                        CommandParameter="THIS SHOULD BE BINDED TO ORDERVIEWMODEL.ID"/>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

ViewModels:

public class MyOrdersViewModel
{     
    public MyOrdersViewModel()
    {

    }    

    public IList<OrderViewModel> Orders { get; set; }
}

public class OrderViewModel 
{
    public OrderViewModel()
    {

    }

    public int Id { get; private set; }
    public DateTime OrderDate { get; private set; }
    public string Status { get; private set; }
    public DateTime LastUpdate { get; private set; }
    public string SomePerson { get; private set; }
    public int SomeNumber { get; private set; }
    public CommandViewModel ShowDetailsCommandViewModel { get; set; }

    private bool showItems;

    public bool ShowItems
    {
        get { return showItems; }
        set
        {
            showItems = value;
            RaisePropertyChanged();
        }
    }   

    public IList<CommandViewModel> Actions { get; private set; } 

    }
}

public class CommandViewModel
{
     public CommandViewModel(string name, ICommand command)
     {
         Name = name;
         Command = command;
     }
     public string Name { get; set; }
     public ICommand Command { get; set; }
 }

我需要将OrderViewModel.Id绑定到OrderViewModel.Actions.Command参数。 我该怎么办?

1 个答案:

答案 0 :(得分:1)

使用RelativeSource查找父级DataGridRow并从其DataContext(OrderViewModel)绑定ID:

CommandParameter="{Binding Path=DataContext.Id, 
                           RelativeSource={RelativeSource AncestorType=DataGridRow}"/>