Как вы ссылаетесь на соответствующий объект из DataTemplate в XAML? - PullRequest
3 голосов
/ 15 июля 2010

Я хочу использовать атрибут CommandParameter в контекстном меню, связанном с DataTemplate. Параметр commandParameter должен содержать ссылку на объект, который вызвал шаблон данных, как показано в примере кода ниже. Я пытался использовать «{Binding Path = this}», но он не работает, потому что «this» не является свойством. Команда запускается, но я не могу получить правильный параметр. У кого-нибудь есть идеи, как это сделать?

Примечание. Я удалил Command = "{Binding DeleteSelectedMeetingCommand}", заменив его ссылкой на локатор представления, и команда запускалась.

       <DataTemplate DataType="{x:Type Models:MeetingDbEntry}">

        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="100"/>
                <ColumnDefinition Width="100"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0"  Text="{Binding Path=HostTeam}"/>
            <TextBlock Grid.Column="1" Text="{Binding Path=GuestTeam}"/>
            <TextBlock Grid.Column="2" Text="{Binding Path=Result}"/>
            <Grid.ContextMenu>
                <ContextMenu Name="MeetingMenu">
                    <MenuItem Header="Delete"  
                              Command="{Binding 
                                            Source={StaticResource Locator}, 
                                            Path=Main.DeleteSelectedMeetingCommand}"
                              CommandParameter="{Binding Path=this}"/>
                </ContextMenu>
            </Grid.ContextMenu>
        </Grid>
    </DataTemplate>

Спасибо

Ответы [ 2 ]

3 голосов
/ 15 июля 2010

Работает с кодом ниже. Вам просто нужно набрать {Binding} в атрибуте CommandParameter, чтобы ссылаться на свойство, которое вызвало DataTemplate.

 <DataTemplate DataType="{x:Type Models:MeetingDbEntry}">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="100"/>
                <ColumnDefinition Width="100"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0"  Text="{Binding Path=HostTeam}"/>
            <TextBlock Grid.Column="1" Text="{Binding Path=GuestTeam}"/>
            <TextBlock Grid.Column="2" Text="{Binding Path=Result}"/>
            <Grid.ContextMenu>
                <ContextMenu Name="MeetingMenu">
                    <MenuItem Header="Delete"  
                              Command="{Binding 
                                      Source={StaticResource Locator}, 
                                      Path=Main.DeleteSelectedMeetingCommand}"
                              CommandParameter="{Binding}"
                              />

                </ContextMenu>
            </Grid.ContextMenu>
        </Grid>
    </DataTemplate>
0 голосов
/ 15 июля 2010

Я бы выставил команду DeleteSelectedMeetingCommand на объект, который он удалял, и привязал бы к нему пункт контекстного меню.Затем добавьте переменную-член, содержащую объект для удаления, к команде и инициализируйте ее с this в объекте, который нужно удалить, который содержит команду.

Пример:

public class DeletableObject
{
    public ICommand DeleteCommand { get; }

    public DeleteableObject()
    {
        DeleteCommand = new DeleteCommand(this);
    }
}

public class DeleteCommand : ICommand
{
    private DeletableObject _DeletableObject;

    public DeleteCommand(DeletableObject deletableObject)
    {
        _DeletableObject = deletableObject;
    }

    // skipped the implementation of ICommand but it deletes _DeletableObject
}

Надеюсь, что это поможет.

...