Привязка событий к кнопкам в ItemsControl - PullRequest
3 голосов
/ 31 июля 2011

У меня есть приложение для Windows Phone 7 с некоторым xaml, которое выглядит следующим образом:

<Grid x:Name="ContentGrid" Grid.Row="1">
    <ItemsControl x:Name="MyView" ItemTemplate="{StaticResource MyInner}"/>
</Grid>

Шаблон элемента здесь выглядит так:

<DataTemplate x:Key="MyInner">
    <ItemsControl ItemsSource="{Binding}" ItemTemplate="{StaticResource MyInner_Item}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
</DataTemplate>

И, наконец, шаблон MyInner_Item выглядит следующим образом::

<DataTemplate x:Key="MyInner_Item">
    <Button x:Name="MyButton">
        <Button.Template>
            <ControlTemplate>
                <Border HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="myborder">

                    <Image Source="{Binding Path=ImageUri}" Width="{Binding Path=Width}" Height="{Binding Path=Height}" Stretch="Fill" />
                </Border>
            </ControlTemplate>
        </Button.Template>
    </Button>
</DataTemplate>

Итак, это ItemsControl, который содержит ItemsControl, который содержит кнопки.По сути, это создает двумерный массив кнопок.

Что я хочу сделать, это добавить обработчик события к событию Click кнопок.

Вот подвох:код, который стоит за этим написан на F #.Насколько мне известно, я не могу указать свой обработчик событий в XAML, так как F # не взаимодействует с WPF любым приятным способом.Поэтому мне нужно добавить свой обработчик событий вручную в коде.

Есть ли простой способ сделать это?

В настоящее время у меня есть некоторый F #, который выглядит следующим образом:

let myView : ItemsControl = this?MyView
do myView.ItemsSource <- viewModel.BoardData 

Здесь BoardData представляет собой список списков.

Мне было интересно, можно ли перебрать элементы управления в ItemsControl, чтобы добавить мои обработчики событий?Хотя у меня возникли проблемы с этим.Например, в следующем:

let container = myView.ItemContainerGenerator.ContainerFromItem(myView.Items.[0])

... устанавливает контейнер в нуль.Фактически, все методы, которые я пробовал из myView.ItemContainerGenerator, возвращают ноль.

Итак, как мне подключить обработчик событий, чтобы я мог реагировать на нажатия кнопок?

1 Ответ

3 голосов
/ 01 августа 2011

Я не занимался разработкой Windows 7 Phone, но я много занимался разработкой XAML + Silverlight с C #, и теперь я начинаю заниматься F #.Подход, который я бы выбрал, заключается в том, чтобы вообще не использовать обработчики событий.Поскольку вы используете кнопку, создайте класс, производный от ICommand, и добавьте этот тип как открытое свойство в вашу модель представления, чтобы вы могли связать его со свойством Command кнопки.Преимущество использования интерфейса ICommand по сравнению с обработчиками событий заключается в том, что вы также можете включить условие, когда кнопка включена для выполнения действия.

Также обратите внимание, что при выполнении выражений связывания внутри (т. е. ItemTemplate) элементов в элементе управления ItemsControl область действия свойств, к которым можно привязаться, сводится к свойствам текущего элемента . Таким образом, все свойства ViewModelвыходят за рамки , если вы не укажете его полностью, т.е. <Button Command={Binding Source=ViewModel, Path=Property1.Property2.etc} />.Дайте мне знать, если это помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...