在WPF中使用Caliburn micro向每个行添加按钮到DataGrid和Event_Click行

问题描述 投票:0回答:1

我正在尝试向DataGrid中的一系列行(行的最后一个单元格)添加一个“View”按钮(使用c#,WPF,Caliburn micro mvvm)。每个按钮都应该有一个处理程序,以另一种形式查看该制作的详细信息。

问题:

  1. 如何在行末添加此按钮?
  2. 如何添加事件处理程序?

我只会查看我用来在每行的最后一列添加单词“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);
        }
    }
}
c# .net wpf datagrid caliburn.micro
1个回答
0
投票

您可以使用DataGridTemplateColumn和Caliburn Micro的Action消息语法为数据网格中的每一行使用Button。

对于问题的第一部分,您可以使用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上阅读更多内容。

© www.soinside.com 2019 - 2024. All rights reserved.