2012-03-29 89 views
0

現在我想通過WPF開發一個Windows服務控制檯程序。每項服務都在一個listview項目中。 HTTP:控制檯的圖像的
鏈路//i.stack.imgur.com/eMX1d.jpg 因此,我定義如下的類:如何綁定列表視圖中每個按鈕的點擊事件?

/// <summary> 
/// 
/// </summary> 
class ServiceItem 
{ 
    #region Fields 
    /// <summary> 
    /// Service Name 
    /// </summary> 
    private string _serviceName; 
    /// <summary> 
    /// Start Button 
    /// </summary> 
    private Button _startButton; 
    /// <summary> 
    /// Pause Button 
    /// </summary> 
    private Button _pauseButton; 
    /// <summary> 
    /// Stop Button 
    /// </summary> 
    private Button _stopButton; 
    #endregion 

    #region Properties 
    /// <summary> 
    /// Service Controller 
    /// </summary> 
    private ServiceController Service 
    { 
     get 
     { 
      var services = ServiceController.GetServices(); 
      var service = services.AsQueryable().Where(o => o.ServiceName == _serviceName).Select(o => o).FirstOrDefault(); 
      return service; 
     } 
    } 
    /// <summary> 
    /// Service Display Name 
    /// </summary> 
    public string ServiceDisplayName 
    { 
     get { return Service.DisplayName; } 
    } 
    /// <summary> 
    /// Service Name 
    /// </summary> 
    private string ServiceName 
    { 
     get { return Service.ServiceName; } 
    } 
    /// <summary> 
    /// Service Current Status 
    /// </summary> 
    public string Status 
    { 
     get 
     { 
      var status = Service.Status; 
      switch (status) 
      { 
       case ServiceControllerStatus.StartPending: 
        return "StartPending"; 
       case ServiceControllerStatus.Running: 
        return "Running";// 
       case ServiceControllerStatus.PausePending: 
        return "PausePending";// 
       case ServiceControllerStatus.Paused: 
        return "Paused";// 
       case ServiceControllerStatus.StopPending: 
        return "StopPending";// 
       case ServiceControllerStatus.Stopped: 
        return "Stopped";// 
       default: 
        return "Unknow";// 
      } 
     } 
    } 
    /// <summary> 
    /// Service Start Mode 
    /// </summary> 
    public string StartMode 
    { 
     get 
     { 
      var startMode = ServiceHelper.GetServiceStartMode(_serviceName); 
      switch (startMode) 
      { 
       case ServiceStartMode.Automatic: 
        return "Automatically";// 
       case ServiceStartMode.Disabled: 
        return "Disabled";// 
       case ServiceStartMode.Manual: 
        return "Manual";// 
       default: 
        return "Unkown";// 
      } 
     } 
    } 

    /// <summary> 
    /// Start Button 
    /// </summary> 
    public Button StartButton 
    { 
     get 
     { 
      return _startButton; 
     } 
    } 
    /// <summary> 
    /// Pause Button 
    /// </summary> 
    public Button PauseButton 
    { 
     get 
     { 
      return _pauseButton; 
     } 
    } 
    /// <summary> 
    /// Stop Button 
    /// </summary> 
    public Button StopButton 
    { 
     get 
     { 
      return _stopButton; 
     } 
    } 
    #endregion 

    #region Constructor 
    /// <summary> 
    /// Init Service Instance 
    /// </summary> 
    public ServiceItem(string serviceName) 
    { 
     _serviceName = serviceName; 
     _startButton = new Button(); 
     _pauseButton = new Button(); 
     _stopButton = new Button(); 

     _startButton.Content = Resources.Media_Play; 
     _pauseButton.Content = Resources.Media_Pause; 
     _stopButton.Content = Resources.Media_Stop; 

     _startButton.IsEnabled = Service.Status != ServiceControllerStatus.Running; 
     _pauseButton.IsEnabled = Service.Status != ServiceControllerStatus.Paused; 
     _stopButton.IsEnabled = Service.Status != ServiceControllerStatus.Stopped; 

     _startButton.Click += StartButton_Click; 
     _pauseButton.Click += PauseButton_Click; 
     _stopButton.Click += StopButton_Click; 
    } 

    #endregion 

    #region Methods 
    /// <summary> 
    /// Start Service 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    public void StartButton_Click(object sender, RoutedEventArgs e) 
    { 
     ServiceHelper.StartService(Service); 
    } 
    /// <summary> 
    /// Stop Service 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    public void StopButton_Click(object sender, RoutedEventArgs e) 
    { 
     ServiceHelper.StopService(Service); 
    } 
    /// <summary> 
    /// Pause Service 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    public void PauseButton_Click(object sender, RoutedEventArgs e) 
    { 
     ServiceHelper.PauseService(Service); 
    } 
    /// <summary> 
    /// Continue Service 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    public void ResumeButton_Click(object sender, RoutedEventArgs e) 
    { 
     ServiceHelper.ResumeService(Service); 
    } 
    #endregion 
} 

和相應的列表視圖XAML是如下:

<ListView x:Name="ServiceList" Background="#353535" BorderBrush="#353535" Foreground="White" Height="295" ItemsSource="{Binding}"> 
      <ListView.View> 
       <GridView AllowsColumnReorder="True"> 
        <GridView.Columns> 
         <GridViewColumn Width="auto" Header="Name" DisplayMemberBinding="{Binding ServiceDisplayName}"></GridViewColumn> 
         <GridViewColumn Width="auto" Header="Status" DisplayMemberBinding="{Binding Status}"></GridViewColumn> 
         <GridViewColumn Width="auto" Header="StartMode" DisplayMemberBinding="{Binding StartMode}"></GridViewColumn> 
         <GridViewColumn Width="auto" Header="Operation"> 
          <GridViewColumn.CellTemplate> 
           <DataTemplate> 
            <Grid x:Name="grdOperations" x:Uid="grdOperations"> 
             <Grid.ColumnDefinitions> 
              <ColumnDefinition Width="*"></ColumnDefinition> 
              <ColumnDefinition Width="*"></ColumnDefinition> 
              <ColumnDefinition Width="*"></ColumnDefinition> 
             </Grid.ColumnDefinitions> 
             <Button Grid.Column="0" Height="24" Width="24" Style="{StaticResource ImageButton}" > 
              <Image Source="Resources/Media Play.png"></Image> 
             </Button> 
             <Button Grid.Column="1" Height="24" Width="24" Margin="1,0,1,0" Style="{StaticResource ImageButton}"> 
              <Image Source="Resources/Media Pause.png"></Image> 
             </Button> 
             <Button Grid.Column="2" Height="24" Width="24" Style="{StaticResource ImageButton}"> 
              <Image Source="Resources/Media Stop.png"></Image> 
             </Button> 
            </Grid> 
           </DataTemplate> 
          </GridViewColumn.CellTemplate> 
         </GridViewColumn> 

        </GridView.Columns> 
       </GridView> 
      </ListView.View> 
     </ListView> 


我創建的ServiceItem實例收集,並將其綁定到ListView:

var services = new List<ServiceItem>() 
     { 
      new ServiceItem("AxInstSV"), 
      new ServiceItem("PeerDistSvc") 
     }; 
     ServiceList.ItemsSource = services; 

現在問題是如何counld /我應該將開始/暫停/停止事件方法綁定到每個按鈕?

回答

0

使用的ICommand界面按鈕

查看的項目模板綁定..

<Button Command="{Binding PlayCommand}" Height="24" Width="24" Style="{StaticResource ImageButton}" > 
    <Image Source="Resources/Media Play.png"></Image> 
</Button> 
<Button Command="{Binding PauseCommand}" Height="24" Width="24" Style="{StaticResource ImageButton}" > 
    <Image Source="Resources/Media Pause.png"></Image> 
</Button> 

和你ServiceItem有公共的ICommand屬性

public ICommand PlayCommand{ get; private set;} 
public ICommand PauseCommand{ get; private set;} 

#region Constructor 
public ServiceItem(string serviceName) 
{ 
    _serviceName = serviceName; 

    //DelegateCommand implement ICommand interface. 
    PlayCommand = new DelegateCommand(Play); 

    //Alternate way you can use lamda expression 
    PauseCommand = new DelegateCommand(()=> ServiceHelper.PauseService(Service)); 
} 
#endregion 

private void Play() 
{ 
    ServiceHelper.StartService(Service); 
} 

*搜索WPF DelegateCommandRelayCommand

0

而不是使用按鈕點擊事件,你應該使用命令。

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx。閱讀本文(特別是「中繼命令邏輯」部分)。實現類似於RelayCommand的類。然後在ServiceItem中有3個命令StartCommand,PauseCommand和StopCommand。將這些與xaml中的按鈕的命令屬性綁定。

+0

_italic_ Thanks!_italic_ – 2012-04-09 02:10:15

相關問題