Привязка к команде реле MVVM Light внутри шаблона данных элемента Windows Phone 7 - PullRequest
4 голосов
/ 10 февраля 2011

Я пытаюсь привязать кнопку к команде viewmodel, используя команды MVVM Light, и по какой-то причине команда, похоже, не вызывается. Обычно у меня нет проблем с использованием команд, но эта, кажется, игнорирует привязку.

Вот мой код:

<ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel>
            <Button>
                <Interactivity:Interaction.Triggers>
                    <Interactivity:EventTrigger EventName="Click">
                        <Command:EventToCommand 
                            Command="{Binding MyButtonClickAction}" />
                    </Interactivity:EventTrigger>
                </Interactivity:Interaction.Triggers>
            </Button>

            <StackPanel>
                <TextBlock Text="{Binding MyProperty}"/>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding MyOtherProperty}" />
                </StackPanel>
            </StackPanel>
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>

Этот шаблон данных находится в списке, который создается после запуска моего приложения, и мне интересно, в этом ли проблема. Моя теория состоит в том, что модель представления создается, и конструктор пытается установить привязку с помощью команды relay, но, поскольку в списке еще нет элементов, привязка каким-то образом завершается неудачно.

Привязки к MyProperty и MyOtherProperty работают нормально.

Какие-нибудь предложения относительно того, как я мог бы заставить это работать?

Ответы [ 2 ]

7 голосов
/ 10 февраля 2011

В качестве примечания вы можете рассмотреть возможность использования класса ButtonBaseExtensions при связывании команд с вашими кнопками.Этот класс можно найти в пространстве имен GalaSoft.MvvmLight.Command в сборке GalaSoft.MvvmLight.WP7.

Ваше пространство имен XAML будет содержать: -

xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.WP7"

Ваша кнопка XAML будет тогдавыглядеть примерно так: -

<Button cmd:ButtonBaseExtensions.Command="{Binding MyButtonClickAction}"/>
7 голосов
/ 10 февраля 2011

Проблема в том, что внутри DataTemplate DataContext является самим элементом, а не вашей ViewModel. Поэтому, когда вы говорите {Binding MyButtonActionClick}, привязка ищет команду MyButtonActionClick для item , которая, как я предполагаю, является простым объектом и не имеет собственных свойств команды.

Есть несколько способов обойти это. Поскольку вы уже используете MMVM Light, лучшим подходом может быть определение вашей коллекции как List<FooViewModel>, а не List<Foo> и упаковка ваших элементов в собственный класс ViewModel. Затем вы можете добавить команду MyButtonActionClick к этой ViewModel и обратный вызов к родительской ViewModel.

В противном случае измените привязку команды, чтобы она смотрела на DataContext самого ItemsControl. Взгляните на этот вопрос (и, конечно, на принятый ответ), чтобы узнать, как это сделать.

...