dir.by  
  Search  
Programming, development, testing
WPF. Windows Presentation Foundation (отдельное приложение exe файл)
Пример портфолио сотрудников с описанием задач: "DataGrid внутри DataGrid используя RowDetailsTemplate" | WPF приложение
  Looked at 3141 times    
 Пример портфолио сотрудников с описанием задач: "DataGrid внутри DataGrid используя RowDetailsTemplate" | WPF приложение 
last updated: 2 October 2022
Нажимаем на Daniel строчку и увидим что открылось описание:
Если нажимаем на Johanes то увидим что открылось описание:
Если нажимаем на Rebeca то увидим что открылось описание:
Шаг 1. Создаем новый проект
Шаг 2. Добавим код в xaml файл
  Файл MainWindow.xaml
<Window x:Class="WpfDataGrids.MainWindow"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
          xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
          xmlns:local="clr-namespace:WpfDataGrids"
          mc:Ignorable="d"
          Title="MainWindow" Height="450" Width="800">
     <Grid>

          <!-- data DataGrid -->
          <DataGrid
               AutoGenerateColumns="False"
               Margin="10"
               IsReadOnly="True"
               ItemsSource="{Binding Customers}"
               FontFamily="Gisha" FontSize="20">

               <DataGrid.Columns>
                    <DataGridTextColumn Header="Customer Name" Binding="{Binding CustomerName}" Width="270" />
                    <DataGridTextColumn Header="Country" Binding="{Binding CustomerCountry}" Width="150"/>
                    <DataGridTextColumn Header="Project Name" Binding="{Binding ProjectName}" Width="150"/>
               </DataGrid.Columns>

               <!-- row detail -->
               <DataGrid.RowDetailsTemplate >
                    <DataTemplate>
                         <StackPanel Orientation="Horizontal">

                              <!-- photo -->
                              <Image Source="{Binding CustomerPhoto}" VerticalAlignment="Top"></Image>

                              <!-- tasks -->
                              <TextBlock FontSize="16" FontWeight="Bold">Tasks:</TextBlock>

                              <!-- sub DataGrid -->
                              <DataGrid
                                   AutoGenerateColumns="False"
                                   Margin="10"
                                   IsReadOnly="True"
                                   ItemsSource="{Binding Tasks}"
                                   FontFamily="Gisha" FontSize="20">
                                  
                                   <DataGrid.Columns>
                                        <DataGridTextColumn Header="Task Name" Binding="{Binding TaskName}" Width="150" />
                                        <DataGridTextColumn Header="Status" Binding="{Binding Status}" Width="150"/>
                                        <DataGridTextColumn Header="Estimation (days)" Binding="{Binding Estimation}" Width="150"/>
                                   </DataGrid.Columns>
                                  
                              </DataGrid>

                         </StackPanel>
                    </DataTemplate>
               </DataGrid.RowDetailsTemplate>
          </DataGrid>

     </Grid>
</Window>
Шаг 3. Добавим код в MainWindow.xaml.cs файл
  Файл MainWindow.xaml.cs
using System;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Input;

namespace WpfDataGrids
{
     public class Task
     {
          public string TaskName { get; set; }
          public string Status { get; set; }
          public int Estimation { get; set; }
     }

     public class Customer
     {
          public string CustomerName { get; set; }
          public string CustomerCountry { get; set; }
          public string CustomerPhoto { get; set; }
          public string ProjectName { get; set; }
          public Task[] Tasks { get; set; }
     }

     public partial class MainWindow : Window
     {
          public ObservableCollection<Customer> Customers { get; set; }

          public MainWindow()
          {
               InitializeComponent();

               // for binding
               this.DataContext = this;

               // data for datagrid
               Customers = new ObservableCollection<Customer>()
               {
                         new Customer() {
                              CustomerName="Daniel", CustomerCountry="Germany", CustomerPhoto="D:/Daniel.jpg", ProjectName = "AirLines",
                              Tasks = new Task[] {
                                   new Task(){TaskName = "Create login page", Status = "Finished", Estimation = 3 },
                                   new Task(){TaskName = "Update seats page", Status = "In Progrsss", Estimation = 2 },
                                   new Task(){TaskName = "Implement algorithm", Status = "Not Started", Estimation = 4 },
                                   new Task(){TaskName = "Writing tests", Status = "Not Started", Estimation = 3 },
                              } },

                         new Customer() {
                              CustomerName="Johanes", CustomerCountry="USA", CustomerPhoto="D:/Johanes.jpg", ProjectName = "Book shop",
                              Tasks = new Task[] {
                                   new Task(){TaskName = "Adding db", Status = "In Progrsss", Estimation = 3 },
                                   new Task(){TaskName = "Query records", Status = "Not Started", Estimation = 3 },
                              } },

                         new Customer() {
                              CustomerName="Rebeca", CustomerCountry="Poland", CustomerPhoto="D:/Rebeca.jpg", ProjectName = "Food site",
                              Tasks = new Task[] {
                                   new Task(){TaskName = "Create dishes list", Status = "Finished", Estimation = 5 },
                                   new Task(){TaskName = "Add tests", Status = "In Progrsss", Estimation = 2 },
                                   new Task(){TaskName = "Check resolutions", Status = "Not Started", Estimation = 1 },
                              } }
               };
          }

     }
}
Шаг 4. Сохраним картинки на D: диск
Скачайте эти картинки к себе на компьютер на диск D:/



Скачать пример
WpfDataGrids.zip ...
размер: 60 kb
Если хотим одновременно открывать несколько людей, вот так:
Напишем код в xaml файле:
  Файл MainWindow.xaml
<Window x:Class="WpfDataGrids.MainWindow"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
          xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
          xmlns:local="clr-namespace:WpfDataGrids"
          xmlns:l="clr-namespace:WpfDataGrids"
          mc:Ignorable="d"
          Title="MainWindow" Height="450" Width="800">
     <Window.Resources>
          <l:BoolToVisibilityConverter x:Key="boolToVisibility" />
     </Window.Resources>

     <Grid>

          <!-- data DataGrid -->
          <DataGrid
               AutoGenerateColumns="False"
               Margin="10"
               IsReadOnly="True"
               RowDetailsVisibilityMode="Visible"
               ItemsSource="{Binding Customers}"
               SelectedItem="{Binding SelectedCustomer}"
               FontFamily="Gisha" FontSize="20">

               <!-- LeftClick will Expand (by settting flag IsVisible = true) / Collapse (by settting flag IsVisible = false) -->
               <DataGrid.InputBindings>
                    <MouseBinding
 
                        MouseAction="LeftClick"
                         Command="{Binding ClickMouseOnCustomer}"/>
               </DataGrid.InputBindings>

               <DataGrid.Columns>
                    <DataGridTextColumn Header="Customer Name" Binding="{Binding CustomerName}" Width="270" />
                    <DataGridTextColumn Header="Country" Binding="{Binding CustomerCountry}" Width="150"/>
                    <DataGridTextColumn Header="Project Name" Binding="{Binding ProjectName}" Width="150"/>
               </DataGrid.Columns>

               <!-- row detail -->
               <DataGrid.RowDetailsTemplate >
                    <DataTemplate>
                         <StackPanel Orientation="Horizontal"
                              Visibility="{Binding IsVisible, Converter={StaticResource boolToVisibility}}">

                              <!-- photo -->
                              <Image Source="{Binding CustomerPhoto}" VerticalAlignment="Top"></Image>

                              <!-- tasks -->
                              <TextBlock FontSize="16" FontWeight="Bold">Tasks:</TextBlock>

                              <!-- sub DataGrid -->
                              <DataGrid
                                   AutoGenerateColumns="False"
                                   Margin="10"
                                   IsReadOnly="True"
                                   ItemsSource="{Binding Tasks}"
                                   FontFamily="Gisha" FontSize="20">

                                   <DataGrid.Columns>
                                        <DataGridTextColumn Header="Task Name" Binding="{Binding TaskName}" Width="150" />
                                        <DataGridTextColumn Header="Status" Binding="{Binding Status}" Width="150"/>
                                        <DataGridTextColumn Header="Estimation (days)" Binding="{Binding Estimation}" Width="150"/>
                                   </DataGrid.Columns>

                              </DataGrid>

                         </StackPanel>
                    </DataTemplate>
               </DataGrid.RowDetailsTemplate>
          </DataGrid>

     </Grid>
</Window>
Напишем код в MainWindow.xaml.cs файле:
  Файл MainWindow.xaml.cs
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Globalization;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Data;
using System.Windows.Input;

namespace WpfDataGrids
{
     public class BoolToVisibilityConverter : IValueConverter
     {
          public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
          {
               var bVal = (bool)value;
               return bVal ? Visibility.Visible : Visibility.Collapsed;
          }

          public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
          {
               throw new NotImplementedException();
          }
     }

     public class Task
     {
          public string TaskName { get; set; }
          public string Status { get; set; }
          public int Estimation { get; set; }
     }

     public class Customer : INotifyPropertyChanged
     {
          public string CustomerName { get; set; }
          public string CustomerCountry { get; set; }
          public string CustomerPhoto { get; set; }
          public string ProjectName { get; set; }
          public Task[] Tasks { get; set; }

          private bool _isVisible;
          public bool IsVisible { get => _isVisible; set => Set(ref _isVisible, value); }

          public event PropertyChangedEventHandler PropertyChanged;
          protected void OnPropertyChanged([CallerMemberName] string name = null)
          {
               PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
          }

          protected virtual bool Set<T>(ref T field, T value, [CallerMemberName] string PropertyName = null)
          {
               if (Equals(field, value)) return false;
               field = value;
               OnPropertyChanged(PropertyName);
               return true;
          }
     }

     public class MyClickCommand : ICommand
     {
          public event EventHandler CanExecuteChanged;
          private readonly Action<object> _callback;
          public MyClickCommand(Action<object> callback)
          {
               _callback = callback;
          }

          public virtual void Execute(object parameter)
          {
               _callback(parameter);
          }

          public virtual bool CanExecute(object parameter) { return true; }

     }

     public partial class MainWindow : Window
     {
          private Customer _selectedCustomer;
          public Customer SelectedCustomer
          {
               get
               {
                    return _selectedCustomer;
               }
               set
               {
                    _selectedCustomer = value;
                    if (_selectedCustomer!=null)
                         _selectedCustomer.IsVisible = !_selectedCustomer.IsVisible;
               }
          }

          public ObservableCollection<Customer> Customers { get; set; }
          // button handler
          public ICommand ClickMouseOnCustomer { get; }

          public MainWindow()
          {
               InitializeComponent();

               // for binding
               this.DataContext = this;

               ClickMouseOnCustomer = new MyClickCommand((param) => {
                    var customer = _selectedCustomer;
                    if (customer != null)
                    {
                         customer.IsVisible =!customer.IsVisible;
                    }
               });

               // data for grid
               Customers = new ObservableCollection<Customer>()
               {
                         new Customer() {
                              CustomerName="Daniel", CustomerCountry="Germany", CustomerPhoto="D:/Daniel.jpg", ProjectName = "AirLines",
                              Tasks = new Task[] {
                                   new Task(){TaskName = "Create login page", Status = "Finished", Estimation = 3 },
                                   new Task(){TaskName = "Update seats page", Status = "In Progrsss", Estimation = 2 },
                                   new Task(){TaskName = "Implement algorithm", Status = "Not Started", Estimation = 4 },
                                   new Task(){TaskName = "Writing tests", Status = "Not Started", Estimation = 3 },
                              } },

                         new Customer() {
                              CustomerName="Johanes", CustomerCountry="USA", CustomerPhoto="D:/Johanes.jpg", ProjectName = "Book shop",
                              Tasks = new Task[] {
                                   new Task(){TaskName = "Adding db", Status = "In Progrsss", Estimation = 3 },
                                   new Task(){TaskName = "Query records", Status = "Not Started", Estimation = 3 },
                              } },

                         new Customer() {
                              CustomerName="Rebeca", CustomerCountry="Poland", CustomerPhoto="D:/Rebeca.jpg", ProjectName = "Food site",
                              Tasks = new Task[] {
                                   new Task(){TaskName = "Create dishes list", Status = "Finished", Estimation = 5 },
                                   new Task(){TaskName = "Add tests", Status = "In Progrsss", Estimation = 2 },
                                   new Task(){TaskName = "Check resolutions", Status = "Not Started", Estimation = 1 },
                              } }
               };
          }

     }
}
Скачать пример
WpfDataGrids2.zip ...
размер: 60 kb
 
← Previous topic
Пример "DataGrid делаем сортировку колонки по своему алгоритму (Custom Sort)" | WPF приложение
 
Next topic →
Пример "В ListView расширяем колонку при добавлении данных (auto column width)" | WPF приложение
 
Your feedback ... Comments ...
   
Your Name
Your comment (www links can only be added by a logged-in user)

  Объявления  
  Объявления  
 
WPF простое новое приложение
Создаем новое WPF приложение | C#
WPF layout
Делаем layout с DockPanel и StackPanel в WPF
События
Пример "Получаем координаты мыши при нажатии левой клавишей мыши на TextBlock"| координаты экрана и относительные координаты | C# WPF приложение
Пример "Получаем координаты мыши при нажатии левой клавишей мыши на Button"| координаты экрана и относительные координаты | C# WPF приложение
Пример "Получаем координаты мыши при нажатии левой клавишей мыши на Grid и рисуем линию"| C# WPF приложение
Пример "При двойном нажатии левой клавишей мыши на Grid показываем сообщение"| C# WPF приложение
WPF элементы
Label
Пример "Устанавливаем текст в Label" через c# код | WPF приложение
иконки FontAwesome
Пример "Показываю иконки, для иконки подключаю библиотеку fontawesome5" | C# WPF приложение
Example "I make animations for icons, library fontawesome5" | C# WPF application
 
TextBlock
Пример "Устанавливаем текст в TextBlock используя Binding". Еще добавим двойной Bindning используя INotifyPropertyChanged | C# WPF приложение
Пример "Несколько TextBlock (показываем тексты) и делаем так чтобы при mouse move выделялся элемент где мышка (mouse over)" | C# WPF приложение
Пример "Получаем координаты мыши при нажатии левой клавишей мыши на TextBlock"| координаты экрана и относительные координаты | C# WPF приложение
Button
Пример "Получаем координаты мыши при нажатии левой клавишей мыши на Button"| координаты экрана и относительные координаты | C# WPF приложение
TextBox
Пример "Устанавливаем и получаем текст в TextBox используя Binding" | C# WPF приложение
Пример "Устанавливаем текст в TextBox" через c# код | WPF приложение
 
TextBox с Place Holder
Пример "Показываем Place Holder в TextBox" | WPF приложение
Пример "Показываем Place Holder с иконкой в TextBox", для иконки подключаю библиотеку fontawesome5 | WPF приложение
 
TextBox с проверкой текста (валидация)
Пример "Устанавливаем текст в TextBox используя Binding и делаем валидацию (если текст не правильный)" | C# WPF приложение
 
ComboBox
Пример "В ComboBox делаем редактирование текста. Получаем текст используя Binding" | C# WPF приложение
 
ItemsControl
Пример "ItemsControl, кнопка и обработчик нажатия" | WPF приложение
Grid
Что такое Grid в WPF
Как добавить RowDefinition, ColumnDefinition в Grid (мышкой в XAML design editor) | C# WPF приложение
В Grid добавляем vertical scrolling | WPF приложение
DataGrid
Пример "DataGrid делаем bind данных", кнопка и обработчик нажатия в DataGrid, выравнивание текста в DataGrid, scrolling | WPF приложение
Как сделать scrolling для DataGrid ? | C# WPF приложение
Scrolling для DataGrid (чтобы скролинг работал когда мы крутим колесо мышки и мышка находится вне scroll bar) | C# WPF приложение
Как выделить row цветом при нажатии на row мышкой (change background for selected row) в DataGrid ? | C# WPF приложение
Как row DataGrid выделить цветом (сделать background) ? | C# WPF приложение
Пример "DataGrid делаем сортировку колонки по своему алгоритму (Custom Sort)" | WPF приложение
DataGrid внутри DataGrid
Пример портфолио сотрудников с описанием задач: "DataGrid внутри DataGrid используя RowDetailsTemplate" | WPF приложение
 
ListView
Пример "В ListView расширяем колонку при добавлении данных (auto column width)" | WPF приложение
Пример "В ListView используем ItemTemplate DataTemplate" | WPF приложение
 
ScrollViewer
В Grid добавляем vertical scrolling | WPF приложение
Как сделать scrolling для DataGrid ? | C# WPF приложение
Scrolling для DataGrid (чтобы скролинг работал когда мы крутим колесо мышки и мышка находится вне scroll bar) | C# WPF приложение
Example "Do ScrollBar less(more) in ScrollViewer" | C# WPF application
Resource файл
Добавляем картинку (jpg, bmp, png) в проект и помечаем как Resource | C# WPF приложение
Image
В элементе Image показываем картинку (jpg, bmp, png) из Resource | C# WPF приложение
Выбираем картинку (jpg, bmp, png) из компьютера и показываем в элементе Image. Сохраняем картинку в базу данных | C# WPF приложение
Пример "В Image элементе делаем Binding для Source" | C# WPF приложение
Пример "Конвертируем текст base64 в картинку Bitmap и показываем в Image элементе" | C# WPF приложение
Пример "Открываем SVG файл и показываем картинку в Image элементе" | C# WPF приложение
 
Canvas
Пример "Создаем Canvas и рисуем картинку" C# WPF
Пример "Рисуем картинку с движением на Canvas" C# WPF
Пример "Рисуем картинку с движением и анимацией sprite на Canvas" C# WPF
 
Line
Рисуем Line (сплошная и штриховая линии) | C# WPF приложение
Пример "Создаем и рисуем линию при нажатии левой клавишей мыши на Grid"| Grid Line | C# WPF приложение
Конвертируем картинку в XAML Path Geometry
Конвертируем SVG в XAML(используя Adobe Illustrator), заполняем Path Data Geometry, показываем линии на экране | C# WPF приложение
Конвертируем SVG в XAML(используя Dias SVG to UWP XAML Converter), заполняем Path Data Geometry, показываем линии на экране | C# WPF приложение
Конвертируем PNG в SVG в XAML | C# WPF приложение
Converter SVG to XAML | WPF C#
Конвертируем XAML в SVG | C# WPF приложение
ViewBox
Пример "ViewBox делаем Binding для Left, Top, Width, Height, ContetnPresenter binding" | C# WPF приложение
Width by percentage
Разделить экран по вертикали (по ширине) на 2 равные части экран (width1 = 50%, width2 = 50%), используем Grid | C# WPF приложение
Разделить экран по вертикали (по ширине) на 2 части (width1 = 70%, width2 = 30%), используем Grid | C# WPF приложение
Пример "Устанавливаем ширину элемента в процентах от ширины родительского элемента" (width in percentage), пишем свой IValueConverter | C# WPF приложение
База данных (Entity Framework)
Entity Framework в приложении WPF. Используем Code First (пишем c# код, а таблицы в базе данных создаются сами)
Создаем свои WPF элементы
Example "Create your own WPF element using Style and a new xaml file. The new element is: at the top Title, at the bottom the text in the frame. Using Binding | C# WPF application
Пример "Создаем свой новый WPF элемент со своими свойсвами в новом cs и xaml файлах. В WPF новом элементе: вверху Title, снизу текст и в рамке | C# WPF приложение
WPF приложение с библиотекой Prism (MVVM шаблон проектирования)
Создаем новое WPF приложение с Prism Unity (разделение проекта на папки Services, Views, ViewModels). Патерн MVVM (Model-View-ViewModel) | C#
WPF приложение с Prism Unity. В приложении Tab и разделения на отдельные xaml используя Region.
WPF приложение с Locator (MVVM шаблон проектирования)
Создаем новое WPF приложение с Locator (разделение проекта на папки Views, ViewModels)
Как добавить Dependency Injection, загрузку из appsettings.json в новом WPF приложении ?
Автоматические тесты
Пишем автоматический тест для WPF C# приложения (используем Nuget.Appium и свойство AutomationProperties.AutomationId)
Вопросы на собеседованиях
В чем отличие static resource от dynamic resource ? | WPF C#
Дополнительные темы, вопросы
Открываем окно свойств (properties) для графического элемента в WPF приложении C#
Ошибки
Error "To run this application, you must install .NET. Would you like to download it now?" | I run WPF the application on C#
Книги
Книги для изучения WPF

  Ваши вопросы присылайте по почте: info@dir.by  
Яндекс.Метрика