0

Windows Phone 7.5 앱용 Silverlight를 작성하고 있습니다.LongListSelector 내에서 데이터 바인딩 된 ContextMenu 참조 ItemTemplate - Windows Phone

ContextMenu Click 이벤트를 호출하자마자 .IsOpenfalse으로 설정하려고하기 때문에 LongListSelector에서 ContextMenu를 참조하고 싶습니다. 내 생각은 이것이 자동으로 일어나야하지만 그렇지 않다는 것입니다.

내 MenuItem 중 하나는 의 가시성을 collapsed에서 visible으로 설정하여 PopUp을 모방 한 것입니다. 코드가 잘 실행되고 가시성이 실제로 변경되는 동안. ContextMenu를 닫지 않으면 앱의 UI에 Grid가 표시되지 않습니다.

LongListSelector의 내 XAML에는 ContextMenu이라는 Menu이라는 ContextMenuItem Click 이벤트를 참조하고 있습니다. 은 ContextMenuItem 뒤에

<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> 

내 코드는 내가 ContextMenu_Opened 이벤트에서의 ContextMenu의 ItemSource을 설정 이벤트를

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 
     } 

    } 

을 클릭합니다. 필드는 모두 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가 닫히지 않는 이유는 MenuItem을 ContextMenu.ItemTemplate 내에 설정할 수 없기 때문입니다. 만약 당신이 ContextMenu이 이상한 행동을 일으키는 휴식 것이다. http://silverlight.codeplex.com/workitem/7427 관련. – Styff

+0

이 댓글에 감사드립니다! – lisp

답변

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; 

두 번째 솔루션은 열려있는 이벤트를 변경

배킹 뷰 모델

<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> 
에 ISOPEN을 결합하는 것입니다에서 메뉴를 얻을 수

그러면 뷰 모델

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.ItemTemplate 내에서 MenuItems를 지정할 수 없기 때문에 ContextMenu가 닫히지 않는 이유를 발견했습니다. 그러나 귀하의 정보는 매우 도움이되었습니다. :) – Styff

관련 문제