Добавьте кнопки в строки DataGrid и Event_Click для каждого, используя Caliburn micro в WPF - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь добавить кнопку «Вид» в серию строк (последнюю ячейку строки) фактур в DataGrid (используя c #, WPF, Caliburn micro mvvm). У каждой кнопки должен быть обработчик, который просматривает детали этой фактуры в другой форме.

Вопросы:

  1. Как добавить эту кнопку в конце строки?
  2. Как добавить обработчик событий?

Я буду просматривать только ту функцию, которую использую для добавления слова «Вид» в последний столбец каждой строки.

Я попытался добавить кнопку с помощью: 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);
        }
    }
}

1 Ответ

0 голосов
/ 05 апреля 2019

Вы можете использовать синтаксис DataGridTemplateColumn и Caliburn Micro, чтобы использовать кнопку для каждой строки в вашей сетке данных.

Для первой части вашего вопроса вы можете добавить кнопку в каждую строку вашей таблицы данных, используя DataGridTemplateColumn,

 <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 Action, чтобы вы могли вызывать метод по щелчкусобытие каждой кнопки.Параметр $ dataContext позволяет передавать соответствующий выбранный элемент данных в качестве параметра методу.

Ваш метод ViewModel будет выглядеть как

    public void ViewUser(object user)
    {
    // Do work
    }

Подробнее о Caliburn.Micro Actions можно прочитать подробнее здесь .

...