2013-01-21 31 views
5

Tôi có một menu ngữ cảnh trong LongListSelector. Danh sách này được tạo và cập nhật trong thời gian chạy.ContextMenu trong DataTemplate Vấn đề ràng buộc

<phone:PanoramaItem Header="{Binding Path=LocalizedResources.SavedGamesHeader, Source={StaticResource LocalizedStrings}}" Orientation="Horizontal"> 
      <phone:LongListSelector Margin="0,0,-22,2" ItemsSource="{Binding SavedGames}"> 
       <phone:LongListSelector.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Vertical" Margin="12,2,0,20" Width="432"> 
          <toolkit:ContextMenuService.ContextMenu> 
           <toolkit:ContextMenu> 
            <toolkit:MenuItem Header="Remove" Click="RemoveSave_OnClick"/> 
           </toolkit:ContextMenu> 
          </toolkit:ContextMenuService.ContextMenu> 
          <Image Margin="10,5,10,0" Height="173" Width="248" Source="{Binding Screen}" Stretch="Fill" HorizontalAlignment="Left"></Image> 
          <StackPanel Width="311" Margin="8,5,0,0" HorizontalAlignment="Left"> 
           <TextBlock Tap="Save_OnTap" Tag="{Binding SavedGame}" Text="{Binding SaveName}" TextWrapping="Wrap" Margin="10,0" Style="{StaticResource PhoneTextExtraLargeStyle}" FontSize="{StaticResource PhoneFontSizeMedium}" Foreground="White" FontWeight="Bold" FontFamily="Arial Black" HorizontalAlignment="Left" /> 
           <TextBlock Text="{Binding GameName}" TextWrapping="Wrap" Margin="10,-2,10,0" Style="{StaticResource PhoneTextSubtleStyle}" HorizontalAlignment="Left" /> 
           <StackPanel Orientation="Horizontal" HorizontalAlignment="Left"> 
            <TextBlock Text="Created on:" Margin="10,-2,10,0" Style="{StaticResource PhoneTextSubtleStyle}" /> 
            <TextBlock Text="{Binding Created}" TextWrapping="Wrap" Margin="5,-2,10,0" Style="{StaticResource PhoneTextSubtleStyle}" /> 
           </StackPanel> 
          </StackPanel> 
         </StackPanel> 
        </DataTemplate> 
       </phone:LongListSelector.ItemTemplate> 
      </phone:LongListSelector> 
     </phone:PanoramaItem> 

Dưới đây là các phương pháp để xử lý sự kiện click vào mục menu

private void RemoveSave_OnClick(object sender, RoutedEventArgs e) 
    { 
     var menuItem = (MenuItem)sender; 
     var saveViewModel = menuItem.DataContext as SavesViewModel; 
     EmuStorageMgr.Instance.DeleteSave(saveViewModel.SavedGame.SaveFolder); 
     App.ViewModel.RescanSaves(); 
    } 

Các phương pháp sau đây populates SavedGames danh sách

public ObservableCollection<SavesViewModel> SavedGames { get; private set; } 
public void RescanSaves() 
    { 
     SavedGames.Clear(); 
     var saves = EmuStorageMgr.Instance.GetSaves(); 
     foreach (var save in saves) 
     { 
      SavedGames.Add(new SavesViewModel(save)); 
     } 
     this.IsSavesLoaded = true; 
     NotifyPropertyChanged("SavedGames"); 
    } 

Vì vậy, khi bộ sưu tập SavedGames được populaed cho lần đầu tiên nó hoạt động hoàn hảo, nhưng khi các bộ sưu tập thay đổi (xóa một số mục cũ, thêm mới) Tôi quan sát một số hành vi lạ. Khi sự kiện OnClick được kích hoạt, tôi thấy menuItem.DataContext không dành cho mục menu mà tôi đã nhấp nhưng đối với một số mục menu cũ đã bị xóa.

+0

Khi bộ sưu tập của bạn thay đổi, hãy thực hiện các mục trong menu của bạn? Tôi nghĩ rằng nó có thể có một cái gì đó để làm với cách ràng buộc được thực hiện và một bên không được cập nhật. Ví dụ: –

+0

, RemoveSave_OnClick có thể xóa mục, mỗi lần gọi là RescanSaves, xóa bộ sưu tập và điền lại – Shedon

Trả lời

8

Tôi không thể để lại nhận xét về bài đăng của bạn vì vậy tôi sẽ nói ở đây:

Đây là vấn đề đã biết và tôi cũng có. Tôi đã không tìm thấy bất kỳ cách nào để giải quyết hoàn toàn vấn đề này và chưa thấy bất kỳ giải pháp nào gần đây. Bạn có thể xem bài đăng của tôi here để đảm bảo vấn đề phù hợp với bạn.

Giải pháp duy nhất mà tôi đã thấy cho đến nay được mô tả ở đây trong một msdn blog from '11. Nó xác định vấn đề trong khung công tác Silverlight và ông cung cấp một giải pháp thay thế mà tôi đã thực hiện. Bao gồm tệp lớp trong dự án của bạn và sử dụng các thẻ XAML, và nó sẽ cho phép contextmenu của bạn tiếp tục đồng bộ hóa với văn bản dữ liệu của cha mẹ. Tôi đã chạy vào một tác dụng phụ nhỏ bằng cách sử dụng nó, vì vậy nó chỉ là một trợ giúp ban nhạc.

Tôi cũng tìm thấy từ một diễn đàn khác biết rằng đó là vấn đề đã biết mà không có giải pháp, nhưng có thể tìm thấy bản vá tại codeplex here. Vấn đề của tôi với các miếng vá là tôi không thể tìm ra cách để thực hiện nó, và cũng LLS (đó là những gì tôi đang sử dụng ContextMenu với) đã di chuyển trực tiếp vào SDK, vì vậy tôi đã bị mắc kẹt.

Đó là tất cả những gì tôi đã tìm hiểu về vấn đề này, hy vọng điều đó sẽ hữu ích. Nếu một người nào đó đã thêm nữa, vui lòng làm.

Cập nhật: Sử dụng một số trong các liên kết được cung cấp ở trên, tôi nghĩ rằng tôi có giải pháp tốt hơn một chút. Trong sự kiện ContextMenu Unloaded, hãy làm mới chế độ xem. Một cái gì đó như:

private void add_but_up(object sender, RoutedEventArgs e) 
    { 
     ContextMenu conmen = (sender as ContextMenu); 
     conmen.ClearValue(FrameworkElement.DataContextProperty); 
    } 

Đây thực chất là bản vá trong blog. Chỉ trong một ngữ cảnh hoàn toàn khác. Vì vậy, vấn đề của tôi là không có khả năng sử dụng các chức năng như ScrollTo(). Làm điều này trong mã phía sau của trang thực tế có vẻ như khắc phục vấn đề ràng buộc ContextMenu.