Добавьте ContextMenu в usercontrols в WrapPanel - PullRequest
1 голос
/ 28 апреля 2011

У меня есть WrapPanel из набора инструментов Silverlight в приложении WP7. В своем коде я добавляю свои пользовательские элементы управления в эту оболочку. Каждый элемент управления пользователя представляет собой квадрат, отображающий информацию о рейсе.

        <ScrollViewer x:Name="MyScrollViewer" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Height="307" VerticalAlignment="Bottom">
            <toolkit:WrapPanel x:Name="MonitoredWrapPanel" Margin="10,0,0,0" MinWidth="200" Width="{Binding ElementName=MyScrollViewer, Path=ViewportWidth}">
                <toolkit:ContextMenuService.ContextMenu>
                    <toolkit:ContextMenu x:Name="FlightContextMenuInGrid">
                        <toolkit:MenuItem Header="Stop monitoring flight" Click="MenuItem_Click" Tag="{Binding Path=FlightId}" />
                    </toolkit:ContextMenu>
                </toolkit:ContextMenuService.ContextMenu>
            </toolkit:WrapPanel>
        </ScrollViewer>

И код позади;

        foreach (var flight in Cache.MonitoredCombinedFlights)
        {
            FlightSquare square = new FlightSquare();
            square.DataContext = flight;
            square.Margin = new Thickness(10, 5, 10, 5);
            this.MonitoredWrapPanel.Children.Add(square);
        }

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

Как я могу получить MenuItem, чтобы понять, на каком FlightSquare он находится?

Ответы [ 2 ]

1 голос
/ 28 апреля 2011

Спасибо за ответ, Денис, вот что я закончил.Я использую список в сочетании с оберткой, чтобы прокрутить список квадратов.

<ListBox Height="311" HorizontalAlignment="Left" Margin="0,323,0,0" Name="MonitoredCombinedFlightsList" VerticalAlignment="Top" Width="450">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <toolkit:WrapPanel x:Name="MonitoredWrapPanel" Margin="10,0,0,0" MinWidth="200">
                    </toolkit:WrapPanel>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Views:FlightSquare Margin="10,5,10,5">
                        <toolkit:ContextMenuService.ContextMenu>
                            <toolkit:ContextMenu x:Name="FlightContextMenuInGrid">
                                <toolkit:MenuItem Header="Stop monitoring flight" Click="MenuItem_Click" Tag="{Binding Path=FlightId}" />
                            </toolkit:ContextMenu>
                        </toolkit:ContextMenuService.ContextMenu>
                    </Views:FlightSquare>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

и в моем коде;

MonitoredCombinedFlightsList.ItemsSource = Cache.MonitoredCombinedFlights;
1 голос
/ 28 апреля 2011

Очевидно, ContextMenu имеет другое значение DataContext. Привязка в каждом квадрате не имеет ничего общего с WrapPanel здесь, и вам придется вручную установить объект привязки для ContextMenu в коде позади.

Так сказать, вот фрагмент, который показывает, как вы можете привязать свойство к выделенному коду (именно то, что вам нужно сделать):

Binding b = new Binding();
b.Source = ObjectToBindTo;
b.Path = new PropertyPath("PropertyToBindTo");

menu.SetBinding(DependencyPropertyToBind, b);

Как говорится, в вашем случае есть еще одна проблема. ContextMenu находится внутри WrapPanel - он привязан к нему, а не к квадрату. Поэтому вы можете изменить способ использования ContextMenu, чтобы он находился внутри квадратного экземпляра, а не общего контейнера.

...