0

我正在爲Windows Phone 7.5應用程序編寫Silverlight。在LongListSelector內引用數據綁定ContextMenu ItemTemplate - Windows Phone

我想引用我的LongListSelector中的ContextMenu,因爲我想在調用ContextMenu Click事件時立即將.IsOpen設置爲false。我的想法是,這應該會自動發生,但事實並非如此。

我的一個MenuItem將<Grid>的可見性從collapsed設置爲visible,它模擬了PopUp。雖然代碼執行得很好,可見性確實發生了變化。除非ContextMenu關閉,否則應用的UI不會顯示網格。

我的XAML的LongListSelector其中包含ContextMenu調用Menu,我希望在ContextMenuItem Click事件中引用。

<toolkit:LongListSelector x:Name="moviesLongList" Background="Transparent" IsFlatList="False" GroupHeaderTemplate="{StaticResource GroupHeaderTemplate}" GroupItemTemplate="{StaticResource GroupItemTemplate}" SelectionChanged="moviesLongList_SelectionChanged" GroupViewClosing="moviesLongList_GroupViewClosing" GroupViewOpened="moviesLongList_GroupViewOpened"> 

        <toolkit:LongListSelector.GroupItemsPanel> 
         <ItemsPanelTemplate> 
          <toolkit:WrapPanel/> 
         </ItemsPanelTemplate> 
        </toolkit:LongListSelector.GroupItemsPanel> 

        <toolkit:LongListSelector.ItemTemplate> 
         <DataTemplate> 
          <StackPanel Height="91" Margin="20,0,0,20" Orientation="Horizontal"> 
           <toolkit:ContextMenuService.ContextMenu > 
            <toolkit:ContextMenu x:Name="Menu" Opened="ContextMenu_Opened" Loaded="Menu_Loaded" Unloaded="Menu_Unloaded"> 
             <toolkit:ContextMenu.ItemTemplate> 
              <DataTemplate> 
               <toolkit:MenuItem Header="{Binding}" Click="ContextMenuButton_Click" LostFocus="MenuItem_LostFocus" /> 
              </DataTemplate> 
             </toolkit:ContextMenu.ItemTemplate> 
            </toolkit:ContextMenu> 
           </toolkit:ContextMenuService.ContextMenu> 

           <Border HorizontalAlignment="Left" Width="61" Height="91" Background="{Binding ID, Converter={StaticResource ThumbImageConvert}}" /> 
           <StackPanel Orientation="Vertical" HorizontalAlignment="Left" Width="395"> 
            <TextBlock x:Name="titleTextBox" Text="{Binding Title, Converter={StaticResource TitleConvert}}" Margin="6,0,6,0" d:LayoutOverrides="Width" FontSize="{StaticResource PhoneFontSizeLarge}" VerticalAlignment="Top" HorizontalAlignment="Left"/> 
            <TextBlock x:Name="yearTextBox" Text="{Binding Year}" Margin="12,0,0,0" HorizontalAlignment="Left" FontSize="{StaticResource PhoneFontSizeMedium}" Foreground="{StaticResource PhoneSubtleBrush}" /> 
           </StackPanel> 
          </StackPanel> 
         </DataTemplate> 
        </toolkit:LongListSelector.ItemTemplate> 

       </toolkit:LongListSelector> 

我身後的ContextMenuItem代碼Click事件

private void ContextMenuButton_Click(object sender, RoutedEventArgs e) 
    { 
     // 
     // This is where I want to set Menu.IsOpen = false to close the ContextMenu. 
     // 

     if ((sender as MenuItem).Header.ToString() == "lend movie") 
     { 
       DisableAppBarIcons(); 
       LendPopUpOverlay.Visibility = System.Windows.Visibility.Visible; 

     } 

     if ((sender as MenuItem).Header.ToString() == "return to collection") 
     { 
      ... Do stuff 
     } 

     if ((sender as MenuItem).Header.ToString() == "add to boxset") 
     { 
      ... Do stuff 

     } 

     if ((sender as MenuItem).Header.ToString() == "delete") 
     { 
      ... Do stuff 
     } 

    } 

我設置的文本菜單的的ItemSource在ContextMenu_Opened事件。這些字段都是List<String>

private void ContextMenu_Opened(object sender, RoutedEventArgs e) 
    { 
     LentMovieObj = (sender as ContextMenu).DataContext as Movies; 

     if (LentMovieObj.IsLent) 
     { 
      (sender as ContextMenu).ItemsSource = menuItemsReturn; 
     } 
     else 
     { 
      (sender as ContextMenu).ItemsSource = menuItemsLendOut; 
     } 
    } 
+1

ContextMenu未關閉的原因是因爲您無法在ContextMenu.ItemTemplate中設置MenuItems。如果你這樣做,你會打破ContextMenu導致這種奇怪的行爲。 http://silverlight.codeplex.com/workitem/7427相關。 – Styff 2012-07-28 03:46:31

+0

感謝您的評論! – lisp 2013-09-03 13:02:02

回答

1

不確定爲什麼ContextMenu沒有關閉,但這裏有兩個解決方案。首先是獲取MenuItem的父項。

private void ContextMenu_Opened(object sender, RoutedEventArgs e) 
{ 
    LentMovieObj = (sender as ContextMenu).DataContext as Movies; 

    if (LentMovieObj.IsLent) 
    { 
     (sender as ContextMenu).DataContext = new ContextMenuViewModel(menuItemsReturn); 
    } 
    else 
    { 
     (sender as ContextMenu).DataContext = ContextMenuViewModel(menuItemsLendOut); 
    } 
} 

private T GetParentOfType<T>(DependencyObject obj) where T : class 
{ 
    if (obj == null) return null; 

    var parent = VisualTreeHelper.GetParent(obj); 
    while (parent != null) 
    { 
     if (parent is T) return parent as T; 

     parent = VisualTreeHelper.GetParent(parent); 
    } 

    return null; 
} 

然後從你的點擊處理程序

var menu = GetParentOfType<ContextMenu>(sender as MenuItem); 
menu.IsOpen = false; 

第二種解決方案是ISOPEN綁定到一個後盾視圖模型

<toolkit:ContextMenuService.ContextMenu > 
    <toolkit:ContextMenu x:Name="Menu" Opened="ContextMenu_Opened" Loaded="Menu_Loaded" Unloaded="Menu_Unloaded" IsOpen="{Binding IsOpen}" ItemsSource="{Binding Items}"> 
     <toolkit:ContextMenu.ItemTemplate> 
      <DataTemplate> 
       <toolkit:MenuItem Header="{Binding}" Click="ContextMenuButton_Click" LostFocus="MenuItem_LostFocus" /> 
      </DataTemplate> 
     </toolkit:ContextMenu.ItemTemplate> 
    </toolkit:ContextMenu> 
</toolkit:ContextMenuService.ContextMenu> 

改變開放活動得到了菜單

然後一個視圖模型

public class ContextMenuViewModel : INotifyPropertyChanged 
{ 
    private bool _isOpen = true; 

    public ContextMenuViewModel(IEnumerable<string> items) 
    { 
     Items = items; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public bool IsOpen 
    { 
     get { return _isOpen; } 
     set { _isOpen = value; OnPropertyChanged("IsOpen"); } 
    } 

    public IEnumerable<String> Items { get; set; } 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

然後將您的ViewModel的IsOpen屬性設置爲false;

+1

感謝您獲取父對象的解決方案以及有關後備ViewModel的建議。 正如我上面評論的那樣,我發現了ContextMenu未關閉的原因是因爲我無法在ContextMenu.ItemTemplate中指定MenuItems。 但是,您的信息相當有幫助。 :) – Styff 2012-07-28 03:48:54

相關問題