Как связать событие нажатия для каждой кнопки в списке? - PullRequest
0 голосов
/ 29 марта 2012

Теперь я хочу разработать консольную программу Windows Service через WPF. Каждый сервис находится в элементе списка.
ссылка на изображение консоли: 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;

Теперь проблема заключается в том, как / как мне привязать метод события start / pause / stop к каждой кнопке?

Ответы [ 2 ]

0 голосов
/ 29 марта 2012

использование 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 голосов
/ 29 марта 2012

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

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx. Прочтите эту статью (в частности, часть «Relaying Command Logic»).Реализуйте класс, похожий на RelayCommand.Затем есть 3 команды StartCommand, PauseCommand и StopCommand в ServiceItem.Свяжите их со свойством команды кнопок в xaml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...