我在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>
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参数。 我该怎么办?
答案 0 :(得分:1)
使用RelativeSource查找父级DataGridRow并从其DataContext(OrderViewModel)绑定ID:
CommandParameter="{Binding Path=DataContext.Id,
RelativeSource={RelativeSource AncestorType=DataGridRow}"/>