【问题标题】:How to bind click event for each button that in a listview?如何为列表视图中的每个按钮绑定点击事件?
【发布时间】:2012-04-12 17:13:48
【问题描述】:

现在我想通过 WPF 开发一个 Windows 服务控制台程序。每个服务都在一个列表视图中。
控制台图片链接: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
}

对应的listview 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;

现在的问题是如何/应该如何将启动/暂停/停止事件方法绑定到每个按钮?

【问题讨论】:

    标签: wpf events listview button binding


    【解决方案1】:

    对按钮使用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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多