2014-04-02 79 views
2

我有一个选项卡控件包含两个选项卡,其中一个显示正在运行的进程的消息,另一个显示我的网页!在一个按钮中绑定两个命令WPF/MVVM

我有三个按钮(开始,停止和清除) 当我按开始进程运行和消息显示。

我需要的是我按下开始按钮,这两个选项卡都显示我所需的内容。这意味着我需要两个绑定两个命令到同一个按钮

你知道如何绑定1按钮的两个命令?

我使用的是MVVM,而我是MVVM中的新手。

<Button Content="Start" Command="{Binding StartProcess_Command }" Height="25" Width="60" Grid.Row="0" Grid.Column="0" Margin="10"/> 
<Button Content="Stop" Command="{Binding StopProcess_Command}" Height="25" Width="60" Grid.Row="0" Grid.Column="1" Margin="10"/> 
<Button Content="Clear" Command="{Binding ClearBtn_Command}" Height="25" Width="60" Grid.Row="0" Grid.Column="2" Margin="10"/> 
<telerik:RadTabControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="1" Grid.ColumnSpan="4" Margin="10"> 
    <telerik:RadTabItem Header="Maestro" IsSelected="{Binding Path=MaestroSelected}"> 
     <ScrollViewer VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible"> 
      <local:WPFBrowser/> 
     </ScrollViewer> 
    </telerik:RadTabItem> 
    <telerik:RadTabItem Header="Messages"> 
     <Grid Background="LightGray"> 
      <ScrollViewer VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible"> 
       <TextBlock TextWrapping="Wrap" Text="{Binding Path=output_process,UpdateSourceTrigger=Default}"/> 
      </ScrollViewer> 
     </Grid> 
    </telerik:RadTabItem> 
</telerik:RadTabControl > 

这是WPFBrowser.cs代码:

  public WPFBrowser() 
      { 
       ServerString = "localhost"; //defualt value 
       PortString = "9999"; //default value 
       this.refreshCommand = new Lunch_Maestro.ViewModel.Command(DoRefreshCommand); 
       m_WPFBrowser = new WebBrowser() 
       { 
        HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch, 
        VerticalAlignment = System.Windows.VerticalAlignment.Stretch 
       }; 

       m_WPFBrowser.Navigated += WPFBrowser_Navigated; 

       this.Content = m_WPFBrowser; 
      } 

      private void WPFBrowser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e) 
      { 
       this.HideScriptErrors(m_WPFBrowser, true); 
      } 


      /// <summary> 
      /// Found this link with interesting scenerios for script erros... 
      /// http://social.msdn.microsoft.com/Forums/vstudio/en-US/4f686de1-8884-4a8d-8ec5-ae4eff8ce6db/new-wpf-webbrowser-how-do-i-suppress-script-errors?forum=wpf 
      /// </summary> 
      public void HideScriptErrors(WebBrowser wb, bool Hide) 
      { 
       FieldInfo fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic); 
       if (fiComWebBrowser == null) return; 

       object objComWebBrowser = fiComWebBrowser.GetValue(wb); 

       if (objComWebBrowser == null) return; 

       objComWebBrowser.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, objComWebBrowser, new object[] { Hide }); 

      } 


      private void DoRefreshCommand() 
      { 
       m_WPFBrowser.Navigate(new Uri("http://" + ServerString + ":" + PortString + "/")); 
      } 

      private bool _maestroSelected; 
      public bool MaestroSelected 
      { 
       get { return _maestroSelected; } 
       set 
       { 
        _maestroSelected = value; 
        if (_maestroSelected == true) 
         m_WPFBrowser.Navigate(new Uri("http://" + ServerString + ":" + PortString + "/")); 
        OnPropertyChanged("MaestroSelected"); 
       } 
      } 

      private readonly WebBrowser m_WPFBrowser; 

      private string _serverString; 
      public string ServerString 
      { 
       get { return _serverString; } 
       set 
       { 
        _serverString = value; 
        OnPropertyChanged("ServerString"); 
       } 
      } 

      private string _portString; 
      public string PortString 
      { 
       get { return _portString; } 
       set 
       { 
        _portString = value; 
        OnPropertyChanged("PortString"); 
       } 
      } 

      private Lunch_Maestro.ViewModel.Command refreshCommand; 
      public Lunch_Maestro.ViewModel.Command RefreshCommand 
      { 
       get { return refreshCommand; } 
      } 
// and Inotify property changes here 

回答

3

你可以从Prism框架使用CompositeCommand。 在viewmodel中创建一个额外的CompositeCommand,使用此CompositeCommand注册两个普通命令并将该按钮绑定到CompositeCommand。

请参阅第130页的Prism documentation了解如何使用CompositeCommands。

您的应用需要引用Prism包中包含的Microsoft.Practices.Prism.dll。

4

你想单击一个Button并运行两段代码......它听起来并不复杂。利用现有RelayCommands之一,这个问题可以被固定为简单,因为这:

public ICommand SomeCommand 
{ 
    get { return new ActionCommand(action) => { RunFirstFunction(action); 
     RunSecondFunction(action) }, canExecute => someCondition); } 
} 

在XAML:

<Button Command="{Binding SomeCommand}" CommandParameter="{Binding SomeObject}"> 
    Click Me 
</Button> 

ActionCommand是我自己的RelayCommand的形式,但所有的delegate ICommand实现的是大致相等,可以这样工作。 CommandParameter值作为action变量进入代码并传递给两个函数。