Привязка команд внутри DataGridTemplateColumn - PullRequest
4 голосов
/ 05 июля 2011

Я работаю над приложением Silverlight, которое широко использует Prism, шаблон MVVM и MEF.По нескольким причинам я решил следовать подходу View-first.

В одном из представлений есть DataGrid, и одним из столбцов этой сетки является DataGridTemplateColumn, в котором есть только кнопка.

Я бы хотел определить и Command, и CommandParameter для кнопки.Команда должна быть DelegateCommand ViewModel.CommandParameter должен быть списком SelectedItems, идущим прямо из dataGrid.

Я пробовал несколько подходов, чтобы сделать это, но либо Command, либо CommandParameter равны нулю.

Это следует за кодом, который я первоначально написал:

<sdk:DataGridTemplateColumn>
    <sdk:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button Width="15" Height="15" Content=">" 
                    Command="{Binding UpdateSearchParametersCommand}" 
                    CommandParameter="{Binding SelectedItems, ElementName=dataGrid}">
        </DataTemplate>
    </sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>

Может кто-нибудь посоветовать мне, как лучше всего это сделать?

Заранее спасибо, Джанлука.

Ответы [ 4 ]

9 голосов
/ 05 июля 2011

Ваша текущая привязка указывает на DataGridRowItem.UpdateSearchParametersCommand.Вам нужно изменить его так, чтобы он указывал на DataGrid.DataContext.UpdateSearchParametersCommand

<sdk:DataGrid x:Name=dataGrid>
    <sdk:DataGridTemplateColumn>
        <sdk:DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <Button Width="15" Height="15" Content=">" 
                        Command="{Binding DataContext.UpdateSearchParametersCommand, ElementName=dataGrid}" 
                        CommandParameter="{Binding SelectedItems, ElementName=dataGrid}">
            </DataTemplate>
        </sdk:DataGridTemplateColumn.CellTemplate>
    </sdk:DataGridTemplateColumn>
</sdk:DataGrid>
1 голос
/ 10 октября 2012

В Silverlight 5 вы можете сделать это

<Button Command="{Binding Path=DataContext.PreviewPublishCommand, RelativeSource={RelativeSource AncestorType=controls:ChildWindow}}" Content="Publish" />

Просто настройте AncestorType, чтобы он был таким, каким является элемент верхнего уровня (UserControl, ChildWindow и т. Д.).

1 голос
/ 05 июля 2011

Если вы связываете свою DataGrid с помощью ItemsSource, то привязка Command и CommandParameter связывается с текущим элементом - так, как вы написали.

В этом случае вы должны использовать альтернативный источник. Команда должна быть привязана к DataContext.UpdateSearchParametersCommand, а CommandParameter - к DataContext.SelectedItems.

В вашем случае невозможно найти ни UpdateSearchParametersCommand, ни SelectedItems в связанном элементе.

ОБНОВЛЕНО

Обязательно установите правильный тип для предка. Я установил его в окно, но, возможно, вы используете UserControl.

<sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <Button Width="15" Height="15" Content=">" 
                Command="{Binding Path=DataContext.UpdateSearchParametersCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" 
                CommandParameter="{Binding Path=DataContext.SelectedItems, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}">
    </DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>

0 голосов
/ 21 июля 2011

Многие из вас пытались помочь мне в этом. Спасибо за это. К сожалению, предоставленные ответы были в основном относительно WPF.

Вот как я решил проблему:

<helpers:BindingHelper.Binding>
<helpers:BindingList>
     <helpers:RelativeSourceBinding TargetProperty="Command" Path="DataContext.ToggleDataArchiveInheritanceCommand" RelativeMode="FindAncestor" AncestorType="ChildWindow" />
</helpers:BindingList>
</helpers:BindingHelper.Binding>

Хорошо, это происходит из другой точки того же приложения, но принцип тот же. Если привязка определена внутри, единственный способ, которым вы пользуетесь в Silverlight для доступа к другим элементам, которые обычно бывают вне области видимости (поскольку они не являются частью DataTemplate), - это пройти по дереву объектов xaml. Это то, что делает BindingHelper.

Размещение здесь, так как я надеюсь, что информация будет полезна для кого-то еще.

Приветствия

Джанлука

...