首页 文章

ListBox里面的DataGrid绑定

提问于
浏览
1

我在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 回答

  • 1

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

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

相关问题