MVTM Light EventToCommand не работает внутри WP7 Pivot DataTemplate - PullRequest
2 голосов
/ 29 октября 2010

У меня очень странная проблема.В моем приложении WP7 у меня есть элемент управления Pivot и шаблон элемента, определенный внутри него (или в ресурсах, я пробовал оба пути, но все же проблема).В шаблоне у меня есть обычная кнопка с определенным EventToCommand (EventName = "Click").У меня также есть та же кнопка с вставленной копией за пределами Pivot.Проблема в том, что кнопка, которая находится вне оси, работает нормально, но кнопка внутри не работает.На самом деле я заметил, что любая команда внутри моего стержня не работает.Я правильно работаю с Командой в ViewModel, потому что та же кнопка, но за пределами оси работает отлично.Есть идеи, в чем может быть проблема?Помогите, пожалуйста.Заранее спасибо.Cheers.

PS Мой код довольно стандартный, но на всякий случай вот он:

    <controls:Pivot Grid.Row="0"
        x:Name="PivotControl"
        Title="{Binding ApplicationTitle}"                         
        ItemsSource="{Binding BlaBla}">

        <controls:Pivot.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                   <Button Content="Click Me">
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="Click">
                                <cmd:EventToCommand Command="{Binding MyCommand, Mode=OneWay}" CommandParameterValue="Test"/>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                    </Button>
           ...

И код ViewModel:

public RelayCommand<string> MyCommand
    {
        get;
        private set;
    }
//And in the constructor ...
MyCommand= new RelayCommand<string>((param) => HandleTheCommand(param));

...

Еще раз спасибо.

Ответы [ 2 ]

5 голосов
/ 29 октября 2010

Поскольку вы находитесь внутри ItemTemplate элемента управления, DataContext, к которому вы привязываетесь, не является вашей ViewModel. Привязка {Binding MyCommand, OneWay} пытается найти свойство MyCommand для объекта из коллекции BlaBla. Это одно из ограничений шаблона команды в том, что внутри DataTemplates ваш DataContext часто не является ViewModel.

Там действительно нет хорошего способа обойти это. Вы можете включить свою команду в объекты в коллекции BlaBla. Вы также можете исправить свой собственный триггер, который ищет в VisualTree вашу ViewModel, а затем извлекает команду посредством отражения вместо фактической привязки.

1 голос
/ 25 января 2011

Проблема с Silverlight / WP7 заключается в том, что контекст данных не наследуется в шаблонах. После использования рефлектора, чтобы копаться в кодовой базе MVVM lite, я обнаружил, что есть хитрый способ заставить его работать. По сути, вместо предоставления ICommand в исходном сценарии, предоставьте свойство зависимости типа Binding. Тогда любой объект может быть связан с этим свойством, потому что Binding может оценивать контекст данных из визуального дерева. Затем создайте наблюдаемый класс привязки, который в основном имеет скрытое присоединенное свойство, связанное с привязкой свойства зависимостей из класса TriggerAction. Теперь вам нужно сделать две вещи: 1. В классе TriggerAction, если изменяется Binding DP, обновите член ObservableBinding 2. В классе ObserableBinding, если скрытый DP изменяется, оцените и сохраните новое значение.

Я надеюсь, что это решит и вашу проблему.

...