如何绑定列表视图中每个按钮的点击事件?
问题描述:
现在我想通过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 /我应该将开始/暂停/停止事件方法绑定到每个按钮?
答
使用的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
答
而不是使用按钮点击事件,你应该使用命令。
http://msdn.microsoft.com/en-us/magazine/dd419663.aspx。阅读本文(特别是“中继命令逻辑”部分)。实现类似于RelayCommand的类。然后在ServiceItem中有3个命令StartCommand,PauseCommand和StopCommand。将这些与xaml中的按钮的命令属性绑定。
_italic_ Thanks!_italic_ – 2012-04-09 02:10:15