在 WPF 中使用 Caliburn micro 向 DataGrid 行添加一个按钮,并向每个行添加 Event_Click
Add a buttons to rows of DataGrid and Event_Click to each using Caliburn micro in WPF
我正在尝试向 DataGrid(使用 c#、WPF、Caliburn micro mvvm)中的 factures 的一系列行(行的最后一个单元格)添加一个按钮 "View"。每个按钮都应该有一个处理程序,以另一种形式查看该事件的详细信息。
问题:
- 如何在行尾添加这个按钮?
- 如何添加事件处理程序?
我将只查看用于在每行的最后一列添加单词 "View" 的函数。
我尝试使用以下方法添加按钮:Button btn = new Button();
并设置其所需参数。但这没有用。
我将分享整个 xaml 和 ViewModel 文件:
<UserControl x:Class="Factures.Views.FactureView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Factures.Views"
xmlns:cal="http://www.caliburnproject.org"
cal:Bind.Model="Shell"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800" FontFamily="Times New Roman">
<Grid IsEnabled="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="20" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="20" />
<RowDefinition Height="*" />
<RowDefinition Height="20" />
</Grid.RowDefinitions>
<DataGrid AlternatingRowBackground="Gray"
Grid.Column="1" Grid.Row="1"
x:Name="Factures"
ItemsSource="{Binding Factures}"
CanUserAddRows="False"
MinWidth="100" MinHeight="50"
FontFamily="Times New Roman"
AutoGenerateColumns="False"
IsReadOnly="True"
>
<DataGrid.Columns>
<DataGridTextColumn Header="Id" Binding="{Binding Path=Id}" />
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" />
<DataGridTemplateColumn Header="View">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button x:Name="BtnView"
cal:Message.Attach="[Event Click]=[BtnView($dataContext)]"
Content="View Facture">
</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</UserControl>
using Caliburn.Micro;
using Factures.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace Factures.ViewModels
{
public class FactureViewModel : Conductor<object>
{
public BindableCollection<FactureModel> Factures { get; set; }
public FactureViewModel()
{
FactureModel facture = new FactureModel();
DataTable allFactures = facture.All();
//Fill Bindable collection
this.FillAllFactures(allFactures);
}
public void BtnView(object row)
{
MessageBox.Show("Hello");
}
private void FillAllFactures(DataTable factures)
{
List<FactureModel> output = new List<FactureModel>();
foreach(DataRow row in factures.Rows)
{
FactureModel fm = new FactureModel
{
Id = System.Convert.ToInt32(row[0].ToString()),
Name = row[1].ToString(),
};
output.Add(fm);
}
this.Factures = new BindableCollection<FactureModel>(output);
}
}
}
您可以使用 DataGridTemplateColumn 和 Caliburn Micro 的 Action 消息语法为数据网格中的每一行使用一个按钮。
对于问题的第一部分,您可以使用 DataGridTemplateColumn 向 Datagrid 的每一行添加一个按钮。
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="View" cal:Message.Attach="[Event Click]=[ViewUser($dataContext)]"></Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
DataGrid 在您的 XAML 中的完整定义看起来像。
<DataGrid ItemsSource="{Binding Users}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Id}" Header="Id"/>
<DataGridTextColumn Binding="{Binding UserName}" Header="UserName"/>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="View" cal:Message.Attach="[Event Click]=[ViewUser($dataContext)]"></Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
cal:Message.Attach="[Event Click]=[ViewUser($dataContext)]"
将使用 Caliburn.Micro 动作语法使您能够在每个按钮的 Click 事件上调用一个方法。 $dataContext 参数允许您将相应的选定数据项作为参数传递给方法。
您的 ViewModel 方法看起来像
public void ViewUser(object user)
{
// Do work
}
您可以阅读有关 Caliburn.Micro 操作 here 的更多信息。
我正在尝试向 DataGrid(使用 c#、WPF、Caliburn micro mvvm)中的 factures 的一系列行(行的最后一个单元格)添加一个按钮 "View"。每个按钮都应该有一个处理程序,以另一种形式查看该事件的详细信息。
问题:
- 如何在行尾添加这个按钮?
- 如何添加事件处理程序?
我将只查看用于在每行的最后一列添加单词 "View" 的函数。
我尝试使用以下方法添加按钮:Button btn = new Button();
并设置其所需参数。但这没有用。
我将分享整个 xaml 和 ViewModel 文件:
<UserControl x:Class="Factures.Views.FactureView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Factures.Views"
xmlns:cal="http://www.caliburnproject.org"
cal:Bind.Model="Shell"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800" FontFamily="Times New Roman">
<Grid IsEnabled="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="20" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="20" />
<RowDefinition Height="*" />
<RowDefinition Height="20" />
</Grid.RowDefinitions>
<DataGrid AlternatingRowBackground="Gray"
Grid.Column="1" Grid.Row="1"
x:Name="Factures"
ItemsSource="{Binding Factures}"
CanUserAddRows="False"
MinWidth="100" MinHeight="50"
FontFamily="Times New Roman"
AutoGenerateColumns="False"
IsReadOnly="True"
>
<DataGrid.Columns>
<DataGridTextColumn Header="Id" Binding="{Binding Path=Id}" />
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" />
<DataGridTemplateColumn Header="View">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button x:Name="BtnView"
cal:Message.Attach="[Event Click]=[BtnView($dataContext)]"
Content="View Facture">
</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</UserControl>
using Caliburn.Micro;
using Factures.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace Factures.ViewModels
{
public class FactureViewModel : Conductor<object>
{
public BindableCollection<FactureModel> Factures { get; set; }
public FactureViewModel()
{
FactureModel facture = new FactureModel();
DataTable allFactures = facture.All();
//Fill Bindable collection
this.FillAllFactures(allFactures);
}
public void BtnView(object row)
{
MessageBox.Show("Hello");
}
private void FillAllFactures(DataTable factures)
{
List<FactureModel> output = new List<FactureModel>();
foreach(DataRow row in factures.Rows)
{
FactureModel fm = new FactureModel
{
Id = System.Convert.ToInt32(row[0].ToString()),
Name = row[1].ToString(),
};
output.Add(fm);
}
this.Factures = new BindableCollection<FactureModel>(output);
}
}
}
您可以使用 DataGridTemplateColumn 和 Caliburn Micro 的 Action 消息语法为数据网格中的每一行使用一个按钮。
对于问题的第一部分,您可以使用 DataGridTemplateColumn 向 Datagrid 的每一行添加一个按钮。
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="View" cal:Message.Attach="[Event Click]=[ViewUser($dataContext)]"></Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
DataGrid 在您的 XAML 中的完整定义看起来像。
<DataGrid ItemsSource="{Binding Users}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Id}" Header="Id"/>
<DataGridTextColumn Binding="{Binding UserName}" Header="UserName"/>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="View" cal:Message.Attach="[Event Click]=[ViewUser($dataContext)]"></Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
cal:Message.Attach="[Event Click]=[ViewUser($dataContext)]"
将使用 Caliburn.Micro 动作语法使您能够在每个按钮的 Click 事件上调用一个方法。 $dataContext 参数允许您将相应的选定数据项作为参数传递给方法。
您的 ViewModel 方法看起来像
public void ViewUser(object user)
{
// Do work
}
您可以阅读有关 Caliburn.Micro 操作 here 的更多信息。