2016-03-16 4 views
0

Я пытаюсь создать ListView с ContextMenu внутри WebBrowser, а затем использовать ICommand для привязки. Однако, приведенный ниже пример, когда это выполняется, я получаю следующую ошибку: Ошибка System.Windows.Data: 4: Не удается найти источник для привязки со ссылкой «RelativeSource FindAncestor, AncestorType =« System.Windows.Controls.ListView », AncestorLevel = '1'». BindingExpression: Path = DataContext.MyCode; DataItem = NULL; целевым элементом является «MenuItem» (Name = ''); предназначаться свойство является 'Command' (тип 'ICommand')WPF создать ListView с ContextMenu внутри WebBrowser с помощью ICommand

Вот мой код: XAML

 <!--WebBrowser to Display Messages--> 
     <WebBrowser Name="webBrowser" 
        Source="http://www.whatever.com" 
        <!--OnContextMenuOpening event in LoadCompleted-->      
        LoadCompleted="webBrowser_LoadCompleted"> 

      <WebBrowser.Resources> 
       <!--Show items on webBrowser on mouserightclick--> 
       <ListView x:Key="wbListView"> 
        <ListView.Resources> 
         <ContextMenu x:Key="wbContextMenu" > 
          <MenuItem Header="Test" CommandParameter="{Binding}" Command="{Binding Path=DataContext.myCode, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}}"/> 
         </ContextMenu> 
        </ListView.Resources> 
        <ListView.ItemContainerStyle> 
         <Style TargetType="{x:Type ListViewItem}"> 
          <Setter Property="ContextMenu" Value="{StaticResource wbContextMenu}"/> 
         </Style> 
        </ListView.ItemContainerStyle> 
       </ListView> 
      </WebBrowser.Resources> 

     </WebBrowser> 

Вот мой код: C#

public myCodeCommand myCode 
    { 
     get { return new myCodeCommand(this); } 
    } 

    public class myCodeCommand : ICommand 
    {   
     public bool CanExecute(object parameter) 
     { 
      Console.WriteLine("WEBBROWSER SEND MESSAGE CAN EXECUTE?"); 
      return true; 
     } 

     public event EventHandler CanExecuteChanged 
     { 
      add { CommandManager.RequerySuggested += value; } 
      remove { CommandManager.RequerySuggested -= value; } 
     } 

     public void Execute(object parameter) 
     { 
      Console.WriteLine("WEBBROWSER SEND MESSAGE EXECUTE SOMETHING"); 
     } 
    } 

ответ

0

Я был в состоянии создать ContextMenu внутри Xaml следующим образом:

 <WebBrowser.ContextMenu> 
      <ContextMenu x:Name="wbContextMenu" > 
       <MenuItem x:Name="menuItemOne" Header="Item 1" Click="menuItemOne_Click" /> 
       <MenuItem x:Name="menuItemTwo" Header="Item 2" Click="menuItemTwo_Click" /> 
      </ContextMenu> 
    </WebBrowser.ContextMenu> 

и обработчик событий wbContextMenu следующим образом: fyi каждый пункт меню имеет свой собственный клик.

DocumentEvents.oncontextmenu += webBrowserChat_ContextMenuOpening; 

    private bool webBrowserChat_ContextMenuOpening(IHTMLEventObj pEvtObj) 
    { 
      wbContextMenu.PlacementTarget = pEvtObj as ContextMenu; 
      wbContextMenu.IsOpen = true; 
    } 

    private void menuItemOne_Click(object sender, RoutedEventArgs e) 
    { 
      //Put whatever you want handled here for menuitem 
    } 

    private void menuItemTwo_Click(object sender, RoutedEventArgs e) 
    { 
      //Put whatever you want handled here for menuitem 
    } 
Смежные вопросы