我试图将按钮“视图”添加到DataGrid(使用C#,WPF,Caliburn micro mvvm)中的一系列连续行(该行的最后一个单元格)。每个按钮都应该有一个处理程序,以另一种形式查看该构造的详细信息。
问题:
我将仅查看我要在每行的最后一列添加“查看”一词的功能。
我尝试使用以下方法添加按钮: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);
}
}
}
答案 0 :(得分:0)
您可以使用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>
在XAML中,DataGrid的完整定义如下所示。
<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 Action语法使您能够在每个按钮的Click事件上调用方法。通过$ dataContext参数,您可以将相应的Selected Data Item作为参数传递给Method。
您的ViewModel方法看起来像
public void ViewUser(object user)
{
// Do work
}
您可以阅读有关Caliburn.Micro Actions here的更多信息。