2012-03-29 4 views
0

이제 WPF를 통해 Windows 서비스 콘솔 프로그램을 개발하고 싶습니다. 각 서비스는 listview의 항목에 있습니다. HTTP : 콘솔 화상
링크 //i.stack.imgur.com/eMX1d.jpg 따라서, I는 다음과 같이 정의 된 클래스 :listview에있는 각 버튼의 클릭 이벤트를 바인딩하는 방법은 무엇입니까?

/// <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; 
,

이제 문제는 어떻게 시작/일시 정지/정지 이벤트 메서드를 각 단추에 바인딩해야합니까?

답변

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 검색 DelegateCommand 또는 RelayCommand

0

버튼 클릭 이벤트를 사용하는 대신 명령을 사용해야합니다.

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx. 이 기사 (특히 'Relaying Command Logic'부분)를 읽으십시오. RelayCommand와 비슷한 클래스를 구현하십시오. 그런 다음 ServiceItem에 StartCommand, PauseCommand 및 StopCommand라는 3 개의 명령이 있습니다. xaml에있는 버튼의 명령 속성으로 이들을 바인딩하십시오.

+0

_italic_ 감사합니다! _italic_ –

관련 문제