2016-09-23 2 views
-2

Вопрос: Как связать любое событие WebBrowser с собственностью ICommand в моей модели просмотра внутри ItemTemplate?Связывание события в DataTemplate WebBrowser TabItem WPF, MVVM

Когда я пытаюсь сделать это с помощью библиотеки интерактивности плавной Expression в нормальном для MvvmLight образом, An Exeption ocurs:

Коллекция Ошибки свойство «Microsoft.VisualStudio.DesignTools.WpfDesigner.InstanceBuilders.HwndHostInstance» . 'Triggers' - null.

WebTabItems наблюдается совокупность элементов ViewModels

Вот код: связывание

<TabControl ItemsSource="{Binding WebTabItems}" SelectedItem="{Binding SelectedWebTabItem}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" > 
       <i:Interaction.Triggers> 
        <i:EventTrigger EventName="SelectionChanged"> 
         <mvvm:EventToCommand Command="{Binding SelectionChangedVMCommand}" PassEventArgsToCommand="True"></mvvm:EventToCommand> 
        </i:EventTrigger> 
       </i:Interaction.Triggers> 

       <TabControl.ItemTemplate> 
        <!--header--> 
        <DataTemplate> 
         <TextBlock Text="{Binding Header}"></TextBlock>        
        </DataTemplate>       
       </TabControl.ItemTemplate> 
       <TabControl.ContentTemplate> 
        <DataTemplate>       
         <Grid > 
          <Grid.RowDefinitions> 
           <RowDefinition Height="auto"></RowDefinition> 
           <RowDefinition></RowDefinition> 
          </Grid.RowDefinitions> 

          <TextBlock Text="{Binding NotificationRibbonText}" Visibility="{Binding NotificationRibbonVisibility}"></TextBlock> 


          <WebBrowser Grid.Row="1" Visibility="Visible" local:WebBrowserExtension.BindableSource="{Binding Sourse}" > 
           <i:Interaction.Triggers> 
            <i:EventTrigger EventName="Navigating"> 
             <mvvm:EventToCommand Command="{Binding NavigatingMVCommand}" PassEventArgsToCommand="True" ></mvvm:EventToCommand> 
            </i:EventTrigger> 
           </i:Interaction.Triggers> 
          </WebBrowser> 



         </Grid> 
        </DataTemplate> 
       </TabControl.ContentTemplate> 

      </TabControl> 

событий в элементе управления вкладка работает отлично, но в шаблоне не

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
            <i:Interaction.Triggers> 
             <i:EventTrigger EventName="Navigating"> 
              <mvvm:EventToCommand Command="{Binding NavigatingMVCommand}" PassEventArgsToCommand="True" ></mvvm:EventToCommand> 
             </i:EventTrigger> 
            </i:Interaction.Triggers> 

Ps Может быть проблема в том, что WebBrowser.Navigating не является маршрутизируемым событием, но проблема такая же, как привязать к нему событие?

ответ

0

Have foud ответа, как связать событие в шаблоне или при использовании библиотеки интерактивности плавной Expression невозможно

Attached свойства типа ICommand другого путь, через который вы можете получить ту же функциональность.

Этот ответ также может быть использован для связывания с не попадаю событий

В моем случае: XAML

<WebBrowser Grid.Row="1" Visibility="Visible" 
             local:WebBrowserExtension.BindableSource="{Binding NavigeteToSourse}" 
             local:WebBrowserExtension.NavigatingCmdExtended="{Binding NavigatingMVCommand}" 

             > 

          </WebBrowser> 

отделенного класса, чтобы добавить вложенные свойства зависимостей к оригинальному веб-браузер

class WebBrowserExtension 
    { 

    #region BindableSourceProperty 

    public static readonly DependencyProperty BindableSourceProperty = 
    DependencyProperty.RegisterAttached("BindableSource", typeof(string), typeof(WebBrowserExtension), new UIPropertyMetadata("", BindableSourcePropertyChanged)); 

    public static string GetBindableSource(DependencyObject obj) 
    { 
     return (string)obj.GetValue(BindableSourceProperty); 
    } 

    public static void SetBindableSource(DependencyObject obj, string value) 
    { 
     obj.SetValue(BindableSourceProperty, value); 
    } 

    public static void BindableSourcePropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
    { 
     WebBrowser browser = o as WebBrowser; 
     if (browser != null) 
     { 
      string uri = e.NewValue as string; 
      browser.Source = !String.IsNullOrEmpty(uri) ? new Uri(uri) : null; 
     } 
    } 
    #endregion 

     #region NavigatingCmdExtended 

     public static ICommand GetNavigatingCmdExtended(DependencyObject obj) 
     { 
      return (ICommand)obj.GetValue(NavigatingCmdExtendedProperty); 
     } 
     public static void SetNavigatingCmdExtended(DependencyObject obj, ICommand value) 
     { 
      obj.SetValue(NavigatingCmdExtendedProperty, value); 
     } 
     // Using a DependencyProperty as the backing store for CalenderOpenCommand. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty NavigatingCmdExtendedProperty = 
     DependencyProperty.RegisterAttached("NavigatingCmdExtended", typeof(ICommand), typeof(WebBrowserExtension), new PropertyMetadata(OnChangedNavigatingCmdExtendedProperty)); 


     private static void OnChangedNavigatingCmdExtendedProperty(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      var webBrowser = d as WebBrowser; 
      if (webBrowser != null) 
      { 
       if (e.NewValue != null) 
       { 
        //attach event handler 
        webBrowser.Navigating += webBrowser_Navigating; 
       } 
       else 
       { 
        //detach event handler 
        webBrowser.Navigating -= webBrowser_Navigating; 
       } 
      } 
     } 
     /// 
     /// Event handler for Calender Opened event. 
     /// 
     /// 
     /// 
     static void webBrowser_Navigating(object sender, NavigatingCancelEventArgs e) 
     { 
      ICommand command = GetNavigatingCmdExtended(sender as DependencyObject); 
      if (command != null) 
      { 
       if (command.CanExecute(e)) 
       { 
        //executes a command 
        command.Execute(e); 
       } 
      } 
     } 
     #endregion 

и команда в ViewModel

public class WebTabItemVievModel: ViewModelBase 
{ 

    public WebTabItemVievModel() 
    { 

     NavigatingMVCommand = new RelayCommand<NavigatingCancelEventArgs>(NavigatingMethod); 

    } 



    public ICommand NavigatingMVCommand { get; set; } 
    private void NavigatingMethod(NavigatingCancelEventArgs e) 
    { 
     Messenger.Default.Send<NotificationMessage <UriChangedMSG>>(new NotificationMessage<UriChangedMSG> (new UriChangedMSG { NewUri = e.Uri.AbsoluteUri },"test")); 
     CurrentUri = e.Uri.AbsoluteUri; 
     NotificationRibbonText = e.Uri.AbsoluteUri; 
    } 

См эту статью для деталей:

http://www.codeproblem.com/articles/frameworks/wpf/87-event-to-command-binding-using-attached-properties-in-plain-wpf-without-any-extra-dependancy?showall=1&limitstart=