ListBox внутри привязки DataGrid - PullRequest
0 голосов
/ 24 июня 2018

У меня проблема с привязкой в ​​XAML. У меня есть DataGrid, который имеет ListBox кнопок внутри. Мне нужно привязать параметр команды кнопок к идентификаторам элементов DataGrid. Я попытался использовать RelativeSource, присвоив имя скрытому столбцу с идентификатором и пытаясь связать столбец datacontext, но ничего не работает. Я также пытался привязать SelectedItem в DataGrid, тогда команда работает нормально, но 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 голосов
/ 24 июня 2018

используйте RelativeSource для поиска родительского DataGridRow и связывания идентификатора из его DataContext (OrderViewModel):

CommandParameter="{Binding Path=DataContext.Id, 
                           RelativeSource={RelativeSource AncestorType=DataGridRow}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...