XamlDbScaffold 4.0.0

dotnet add package XamlDbScaffold --version 4.0.0
                    
NuGet\Install-Package XamlDbScaffold -Version 4.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="XamlDbScaffold" Version="4.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="XamlDbScaffold" Version="4.0.0" />
                    
Directory.Packages.props
<PackageReference Include="XamlDbScaffold" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add XamlDbScaffold --version 4.0.0
                    
#r "nuget: XamlDbScaffold, 4.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package XamlDbScaffold@4.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=XamlDbScaffold&version=4.0.0
                    
Install as a Cake Addin
#tool nuget:?package=XamlDbScaffold&version=4.0.0
                    
Install as a Cake Tool

/// Hello window /// <Grid> <TabControl> <TabItem Header="Авторизация"> <StackPanel> <TextBlock Text="Авторизация" HorizontalAlignment="Center" FontWeight="Bold" FontSize="30" Margin="15"/> <TextBlock Text="Логин" HorizontalAlignment="Center"/> <TextBox x:Name="LoginBox" Width="200" Height="25"/> <TextBlock Text="Пароль" HorizontalAlignment="Center"/> <TextBox x:Name="PasswordBox" Width="200" Height="25"/> <Button x:Name="EnterButton" Content="Войти" Height="20" Width="70" Margin="10" Click="EnterButton_Click"/> </StackPanel> </TabItem> <TabItem Header="Просмотр товаров"> <DataGrid x:Name="ProductsList" AutoGenerateColumns="False" IsReadOnly="True"> <DataGrid.Columns> <DataGridTextColumn Header="Артикул" Binding="{Binding IdProduct}" /> <DataGridTextColumn Header="Наименование товара" Binding="{Binding Name}"/> <DataGridTextColumn Header="Цена" Binding="{Binding Price}"/> <DataGridTextColumn Header="Скидка" Binding="{Binding Discount}"/> <DataGridTextColumn Header="Код получения" Binding="{Binding StorageCount}"/> <DataGridTextColumn Header="Описание" Binding="{Binding Description}"/> <DataGridTextColumn Header="Поставщик" Binding="{Binding Suppliers.Name}"/> <DataGridTextColumn Header="Производитель" Binding="{Binding Manufacturers.Name}"/> <DataGridTextColumn Header="Категория" Binding="{Binding Category.Name}"/> <DataGridTemplateColumn Header="Фото"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Image Source="{Binding PhotoUrl}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> <DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Style.Triggers> <DataTrigger Binding="{Binding IsHighDiscount}" Value="True"> <Setter Property="Background" Value="#2E8B57"/> </DataTrigger> </Style.Triggers> </Style> </DataGrid.RowStyle> </DataGrid> </TabItem> </TabControl> </Grid>

public partial class HelloWindow : Window
{
    public HelloWindow()
    {
        InitializeComponent();
        LoadProducts();
    }

    private void EnterButton_Click(object sender, RoutedEventArgs e)
    {
        if (string.IsNullOrWhiteSpace(LoginBox.Text) || string.IsNullOrWhiteSpace(PasswordBox.Text))
        {
            MessageBox.Show("Введите логин и пароль");
            return;
        }

        try
        {
            var user = user18Entities.GetContext().Users.FirstOrDefault(p => p.Email == LoginBox.Text && p.Password == PasswordBox.Text);
            if (user == null)
            {
                MessageBox.Show("Такого пользователя не существует", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            var role = user.Roles.FirstOrDefault().Name;
            if (role == "Авторизированный клиент")
            {
                UserWindow userWindow = new UserWindow();
                userWindow.Show();
                this.Close();
            }
            else if (role == "Администратор")
            {
                AdminWindow adminWindow = new AdminWindow();
                adminWindow.Show();
                this.Close();
            }

            else if (role == "Менеджер")
            {
                ManagerWindow managerWindow = new ManagerWindow();
                managerWindow.Show();
                this.Close();
            }
            else
            {
                MessageBox.Show("Такой роли не существует", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
            }

        }
        catch
        {
            MessageBox.Show("Ошибка базы данных", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
        }
    }

    private void LoadProducts()
    {
        try
        {
            ProductsList.ItemsSource = user18Entities.GetContext().Products.ToList();
        }
        catch
        {
            MessageBox.Show("Ты долбаеб", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
        }
    }
}

APPP XAML

<Application.Resources>
    <Style TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Times New Roman"/>
        
    </Style>
    <Style TargetType="Button">
        <Setter Property="Background" Value="#00fa9a"/>
        <Setter Property="FontFamily" Value="Times New Roman"/>
    </Style>
    <Style TargetType="TextBox">
        <Setter Property="FontFamily" Value="Times New Roman"/>
    </Style>
</Application.Resources>

ПОКАЗ ТОВАРОВ <Grid> <DataGrid x:Name="ProductsList" AutoGenerateColumns="False" IsReadOnly="True"> <DataGrid.Columns> <DataGridTextColumn Header="Артикул" Binding="{Binding IdProduct}" /> <DataGridTextColumn Header="Наименование товара" Binding="{Binding Name}"/> <DataGridTextColumn Header="Цена" Binding="{Binding Price}"/> <DataGridTextColumn Header="Скидка" Binding="{Binding Discount}"/> <DataGridTextColumn Header="Код получения" Binding="{Binding StorageCount}"/> <DataGridTextColumn Header="Описание" Binding="{Binding Description}"/> <DataGridTextColumn Header="Поставщик" Binding="{Binding Suppliers.Name}"/> <DataGridTextColumn Header="Производитель" Binding="{Binding Manufacturers.Name}"/> <DataGridTextColumn Header="Категория" Binding="{Binding Category.Name}"/> <DataGridTemplateColumn Header="Фото"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Image Source="{Binding PhotoUrl}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> </Grid> private void LoadProducts() { try { ProductsList.ItemsSource = user18Entities.GetContext().Products.ToList(); } catch { MessageBox.Show("Ошибка базы данных", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error); } }

ПОКАЗ ТОВАВРОВ С СОРТИРОВКОЙ ФИЛЬТРАЦИЕЙ И ПОИСКОМ

    public СЮДА ВСТАВИТЬ НАЗВАНИЕ ОКНА()
    {
        InitializeComponent();
        LoadOrders();
        LoadProducts();

        var cat = user18Entities.GetContext().Category.Select(c => c.Name).ToList();
        cat.Add("Нет фильтра");
        FilterBox.ItemsSource = cat;
        FilterBox.SelectedIndex = 2;
    }

    private void LoadOrders()
    {
        try
        {
            OrdersData.ItemsSource = memeEntities.GetContext().Orders.ToList();
        }
        catch
        {
            MessageBox.Show("Ошибка базы данных", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
        }
    }

    private void LoadProducts()
    {
        try
        {
            var products = memeEntities.GetContext().Products.ToList();

            if (!string.IsNullOrEmpty(SearchBox.Text))
            {
                products = products.Where(p => p.Name.Contains(SearchBox.Text)).ToList();
            }

            if ((string)FilterBox.SelectedItem != "Нет фильтра")
            {
                products = products.Where(p => p.Category.Name == (string)FilterBox.SelectedItem).ToList();
            }

            ProductsData.ItemsSource = products;
        }
        catch
        {
            MessageBox.Show("Ошибка базы данных", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
        }
    }

    private void SearchBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
    {
        LoadProducts();
    }

    private void FilterBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        LoadProducts();
    }



<Grid>
    <TabControl>
        <TabItem Header="Просмотр товаров">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="7*"/>
                </Grid.RowDefinitions>

                <TextBox x:Name="SearchBox" Grid.Row="0" TextChanged="SearchBox_TextChanged"/>
                <ComboBox x:Name="FilterBox" Grid.Row="1" SelectionChanged="FilterBox_SelectionChanged"/>
                <DataGrid x:Name="ProductsData" 
                 Grid.Row="2" AutoGenerateColumns="False" IsReadOnly="True">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Артикул" Binding="{Binding IdProduct}" />
                        <DataGridTextColumn Header="Наименование товара" Binding="{Binding Name}"/>
                        <DataGridTextColumn Header="Цена" Binding="{Binding Price}"/>
                        <DataGridTextColumn Header="Скидка" Binding="{Binding Discount}"/>
                        <DataGridTextColumn Header="Код получения" Binding="{Binding StorageCount}"/>
                        <DataGridTextColumn Header="Описание" Binding="{Binding Description}"/>
                        <DataGridTextColumn Header="Поставщик" Binding="{Binding Suppliers.Name}"/>
                        <DataGridTextColumn Header="Производитель" Binding="{Binding Manufacturers.Name}"/>
                        <DataGridTextColumn Header="Категория" Binding="{Binding Category.Name}"/>
                        <DataGridTemplateColumn Header="Фото">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <Image Source="{Binding PhotoUrl}"/>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                    </DataGrid.Columns>
                    <DataGrid.RowStyle>
                        <Style TargetType="DataGridRow">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding IsHighDiscount}" Value="True">
                                    <Setter Property="Background" Value="#2E8B57"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </DataGrid.RowStyle>
                </DataGrid>
            </Grid>
        </TabItem>
        <TabItem Header="Просмотр заказов">
            <DataGrid x:Name="OrdersData" AutoGenerateColumns="False" IsReadOnly="True">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Ид заказа" Binding="{Binding IdOrder}" />
                    <DataGridTextColumn Header="Дата заказа" Binding="{Binding OrderDate}"/>
                    <DataGridTextColumn Header="Дата доставки" Binding="{Binding DeliveryDate}"/>
                    <DataGridTextColumn Header="Адрес склада" Binding="{Binding PickUpPoints.Address}"/>
                    <DataGridTextColumn Header="Пользователь" Binding="{Binding Users.FIO}"/>
                    <DataGridTextColumn Header="Код получения" Binding="{Binding ReceiptCode}"/>
                    <DataGridTextColumn Header="Статус заказа" Binding="{Binding OrderStatus}"/>
                    <DataGridTextColumn Header="Товар" Binding="{Binding OrdersName}"/>
                </DataGrid.Columns>
            </DataGrid>
        </TabItem>
    </TabControl>
</Grid>

ДОПОЛНИТЕЛЬНЫЕ ПОЛЯ ДЛЯ МОДЕЛЕЙ ДЛЯ ПРОДУКТОВ [NotMapped]

    public string PhotoUrl => $"/res/{Photo}";

    [NotMapped]
    public bool IsHighDiscount => Discount >= 15;

ДЛЯ ЗАКАЗОВ [NotMapped] public string OrdersName ⇒ string.Join(", ", ProductsOrders.Select(po ⇒ po.Products.Name));

ДОБАВЛЕНИЕ ТОВАРОВ <StackPanel> <TextBlock Text="Ид товара:"/> <TextBox x:Name="IdProductBox"/> <TextBlock Text="Название:"/> <TextBox x:Name="NameBox"/> <TextBlock Text="Цена:"/> <TextBox x:Name="PriceBox"/> <TextBlock Text="Ид поставщика:"/> <TextBox x:Name="IdSupplierBox"/> <TextBlock Text="Ид производителя:"/> <TextBox x:Name="IdManufacturerBox"/> <TextBlock Text="Ид категории:"/> <TextBox x:Name="IdCategoryBox"/> <TextBlock Text="Скидка:"/> <TextBox x:Name="DiscountBox"/> <TextBlock Text="Количество товара на складе:"/> <TextBox x:Name="StorageCountBox"/> <TextBlock Text="Описание:"/> <TextBox x:Name="DescriptionBox"/> <Button x:Name="SaveButton" Content="Сохранить" Margin="10" VerticalAlignment="Center" Width="120" Height="25" Click="SaveButton_Click"/> </StackPanel> private void SaveButton_Click(object sender, RoutedEventArgs e) { try { if (!float.TryParse(PriceBox.Text, out float price)) { MessageBox.Show( "Некорректная цена!", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);

                return;
            }

            if (!int.TryParse(IdSupplierBox.Text, out int supplierId))
            {
                MessageBox.Show(
                    "Некорректный ID поставщика!",
                    "Ошибка",
                    MessageBoxButton.OK,
                    MessageBoxImage.Error);

                return;
            }

            if (!int.TryParse(IdManufacturerBox.Text, out int manufacturerId))
            {
                MessageBox.Show(
                    "Некорректный ID производителя!",
                    "Ошибка",
                    MessageBoxButton.OK,
                    MessageBoxImage.Error);

                return;
            }

            if (!int.TryParse(IdCategoryBox.Text, out int categoryId))
            {
                MessageBox.Show(
                    "Некорректный ID категории!",
                    "Ошибка",
                    MessageBoxButton.OK,
                    MessageBoxImage.Error);

                return;
            }

            if (!int.TryParse(StorageCountBox.Text, out int storageCount))
            {
                MessageBox.Show(
                    "Некорректное количество товара!",
                    "Ошибка",
                    MessageBoxButton.OK,
                    MessageBoxImage.Error);

                return;
            }

            if (string.IsNullOrWhiteSpace(IdProductBox.Text) ||
                string.IsNullOrWhiteSpace(NameBox.Text))
            {
                MessageBox.Show(
                    "Заполните обязательные поля!",
                    "Ошибка",
                    MessageBoxButton.OK,
                    MessageBoxImage.Warning);

                return;
            }

            Products product = new Products()
            {
                ProductArticleNumber = IdProductBox.Text,
                Name = NameBox.Text,
                MinCostForAgent = price,
                SupplierID = supplierId,
                ManufacturerID = manufacturerId,
                CategoryID = categoryId,
                DiscountAmount = discount,
                QuantityInStock = storageCount,
                Description = DescriptionBox.Text
            };

            user18Entities.GetContext().Products.Add(product);
            user18Entities.GetContext().SaveChanges();

            MessageBox.Show(
                "Товар успешно добавлен!",
                "Успех",
                MessageBoxButton.OK,
                MessageBoxImage.Information);

            this.Close();
        }
        catch ()
        {
            MessageBox.Show(
                "Ошибка бд",
                "Ошибка",
                MessageBoxButton.OK,
                MessageBoxImage.Error);
        }
    }

ОКНО Администратора <Grid> <TabControl> <TabItem Header="Просмотр товаров"> <Grid> <Grid.RowDefinitions> <RowDefinition Height=""/> <RowDefinition Height=""/> <RowDefinition Height="7*"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions>

            <TextBox x:Name="SearchBox" Grid.Row="0" TextChanged="SearchBox_TextChanged"/>
            <ComboBox x:Name="FilterBox" Grid.Row="1" SelectionChanged="FilterBox_SelectionChanged"/>
            <Button Grid.Column="1" Content="Удалить" x:Name="DeleteProductButton" Click="DeleteProductButton_Click"/>
            <Button Grid.Column="1" Grid.Row="1" Content="Добавить" x:Name="AddProductButton" Click="AddProductButton_Click"/>

            <DataGrid x:Name="ProductsData" 
             Grid.Row="2" AutoGenerateColumns="False" IsReadOnly="True" Grid.ColumnSpan="2">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Артикул" Binding="{Binding IdProduct}" />
                    <DataGridTextColumn Header="Наименование товара" Binding="{Binding Name}"/>
                    <DataGridTextColumn Header="Цена" Binding="{Binding Price}"/>
                    <DataGridTextColumn Header="Скидка" Binding="{Binding Discount}"/>
                    <DataGridTextColumn Header="Код получения" Binding="{Binding StorageCount}"/>
                    <DataGridTextColumn Header="Описание" Binding="{Binding Description}"/>
                    <DataGridTextColumn Header="Поставщик" Binding="{Binding Suppliers.Name}"/>
                    <DataGridTextColumn Header="Производитель" Binding="{Binding Manufacturers.Name}"/>
                    <DataGridTextColumn Header="Категория" Binding="{Binding Category.Name}"/>
                    <DataGridTemplateColumn Header="Фото">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Image Source="{Binding PhotoUrl}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
                <DataGrid.RowStyle>
                    <Style TargetType="DataGridRow">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding IsHighDiscount}" Value="True">
                                <Setter Property="Background" Value="#2E8B57"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </DataGrid.RowStyle>
            </DataGrid>
        </Grid>
    </TabItem>
    <TabItem Header="Просмотр заказов">
        <DataGrid x:Name="OrdersData" AutoGenerateColumns="False" IsReadOnly="True">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Ид заказа" Binding="{Binding IdOrder}" />
                <DataGridTextColumn Header="Дата заказа" Binding="{Binding OrderDate}"/>
                <DataGridTextColumn Header="Дата доставки" Binding="{Binding DeliveryDate}"/>
                <DataGridTextColumn Header="Адрес склада" Binding="{Binding PickUpPoints.Address}"/>
                <DataGridTextColumn Header="Пользователь" Binding="{Binding Users.FIO}"/>
                <DataGridTextColumn Header="Код получения" Binding="{Binding ReceiptCode}"/>
                <DataGridTextColumn Header="Статус заказа" Binding="{Binding OrderStatus}"/>
                <DataGridTextColumn Header="Товар" Binding="{Binding OrdersName}"/>
            </DataGrid.Columns>
        </DataGrid>
    </TabItem>
</TabControl>

</Grid>

public partial class AdminWindow : Window
{
    public AdminWindow()
    {
        InitializeComponent();
        LoadOrders();
        LoadProducts();

        var cat = memeEntities.GetContext().Category.Select(c => c.Name).ToList();
        cat.Add("Нет фильтра");
        FilterBox.ItemsSource = cat;
        FilterBox.SelectedIndex = 2;
    }

    private void LoadOrders()
    {
        try
        {
            OrdersData.ItemsSource = memeEntities.GetContext().Orders.ToList();
        }
        catch
        {
            MessageBox.Show("Ты долбаеб", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
        }
    }

    private void LoadProducts()
    {
        try
        {
            var products = memeEntities.GetContext().Products.ToList();

            if (!string.IsNullOrEmpty(SearchBox.Text))
            {
                products = products.Where(p => p.Name.Contains(SearchBox.Text)).ToList();
            }

            if ((string)FilterBox.SelectedItem != "Нет фильтра")
            {
                products = products.Where(p => p.Category.Name == (string)FilterBox.SelectedItem).ToList();
            }

            ProductsData.ItemsSource = products;
        }
        catch
        {
            MessageBox.Show("Ты долбаеб", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
        }
    }

    private void SearchBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
    {
        LoadProducts();
    }

    private void FilterBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        LoadProducts();
    }

    private void DeleteProductButton_Click(object sender, RoutedEventArgs e)
    {
        if (ProductsData.SelectedIndex == -1) 
        {
            MessageBox.Show("Пожалуйста выберите данные для удаления", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
            return;
        }

        try
        {
            var product = (Products)ProductsData.SelectedItem;
            memeEntities.GetContext().Products.Remove(product);
            memeEntities.GetContext().SaveChanges();
            LoadProducts();
        }
        catch
        {
            MessageBox.Show("Ошибка удаления", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
        }
    }

    private void AddProductButton_Click(object sender, RoutedEventArgs e)
    {
        var newWindow = new AddProducts();
        newWindow.ShowDialog();
        LoadProducts();
    }
}

БАЗА ДАННЫХ use user18; create table Roles ( IdRole int identity primary key, NameRole nvarchar(50) not null );

create table Users ( IdUser int identity primary key, FIO nvarchar(100) not null );

create table UserRoles ( IdUser int foreign key references Users(IdUser) on delete cascade on update cascade, IdRole int foreign key references Roles(IdRole) on delete cascade on update cascade, LoginUser nvarchar(150) not null, PasswordUser nvarchar(150) not null, primary key(IdUser,IdRole) );

create table Suppliers ( IdSupplier int identity primary key, NameSupplier nvarchar(150) not null );

create table Categorys ( IdCategory int identity primary key, NameCategory nvarchar(150) not null );

create table Manufacturers ( IdManufacturer int identity primary key, NameManufacturer nvarchar(150) not null );

create table PickUpPoints ( IdPoint int identity primary key, NamePoint nvarchar(150) not null );

create table Orders ( IdOrder int identity primary key, DateOrder date, DateDelivery date, Code nvarchar(50), Statuc nvarchar(50) );

create table Products ( ArticleProduct nvarchar(50) primary key, NameProduct nvarchar(50) not null, Measurement nvarchar(50) not null, Price int not null, Discount int , DescriptionProduct nvarchar(max) not null, Photo nvarchar(10) );

create table UserOrders ( IdUser int foreign key references Users(IdUser) on delete cascade on update cascade, IdOrder int foreign key references Orders(IdOrder) on delete cascade on update cascade, primary key(IdUser,IdOrder) );

create table SupplierProducts ( IdSupplier int foreign key references Suppliers(IdSupplier) on delete cascade on update cascade, Article nvarchar(50) foreign key references Products(ArticleProduct) on delete cascade on update cascade, primary key(IdSupplier,Article) );

create table OrderPoints ( IdOrder int foreign key references Orders(IdOrder) on delete cascade on update cascade, IdPoint int foreign key references PickUpPoints(IdPoint) on delete cascade on update cascade, primary key(IdOrder,IdPoint) );

create table OrderProducts ( IdOrder int foreign key references Orders(IdOrder) on delete cascade on update cascade , ArticleProduct nvarchar(50) foreign key references Products(ArticleProduct) on delete cascade on update cascade , primary key(IdOrder,ArticleProduct) );

create table CategoryProducts ( IdCategory int foreign key references Categorys(IdCategory) on delete cascade on update cascade, ArticleProduct nvarchar(50) foreign key references Products(ArticleProduct) on delete cascade on update cascade, primary key(IdCategory,ArticleProduct) );

create table ManufacturerProducts ( IdManufacturer int foreign key references Manufacturers(IdManufacturer) on delete cascade on update cascade, ArticleProduct nvarchar(50) foreign key references Products(ArticleProduct) on delete cascade on update cascade, primary key(IdManufacturer,ArticleProduct) );

<ListView Grid.Row="1" Grid.ColumnSpan="2" x:Name="ProductsListView" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"> <ListView.ItemTemplate> <DataTemplate> <Border Background="{Binding RelativeSource={RelativeSource AncestorType=ListViewItem}, Path=Background}" Padding="5"> <DockPanel> <Image DockPanel.Dock="Right" Source="{Binding PhotoUrl}" Width="100" Height="100"/> <TextBlock Text="{Binding Article}" DockPanel.Dock="Top"/> <TextBlock Text="{Binding Name}" DockPanel.Dock="Top"/> <TextBlock Text="{Binding Price}" DockPanel.Dock="Top"/> <TextBlock Text="{Binding Supplier.Name}" DockPanel.Dock="Top"/> <TextBlock Text="{Binding Category}" DockPanel.Dock="Top"/> <TextBlock Text="{Binding Discount}" DockPanel.Dock="Top"/> <TextBlock Text="{Binding StockCount}" DockPanel.Dock="Top"/> <TextBlock Text="{Binding Description}" DockPanel.Dock="Top"/> </DockPanel> </Border> </DataTemplate> </ListView.ItemTemplate> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="{StaticResource SecondBackgroundColor}"/> </Trigger>

             <DataTrigger Binding="{Binding IsHighDiscount}" Value="True">
                 <Setter Property="Background" Value="{StaticResource DiscountColor}"/>
             </DataTrigger>

         </Style.Triggers>
     </Style>
 </ListView.ItemContainerStyle>

</ListView>

Product Compatible and additional computed target framework versions.
.NET Framework net48 is compatible.  net481 was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETFramework 4.8

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
4.0.0 109 5/26/2026
3.0.0 107 5/25/2026
2.0.0 102 5/25/2026
1.0.0 106 5/25/2026