Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从WPF中的ListView选择在DataGrid上添加数量列_C#_Wpf_Xaml_Data Binding - Fatal编程技术网

C# 如何从WPF中的ListView选择在DataGrid上添加数量列

C# 如何从WPF中的ListView选择在DataGrid上添加数量列,c#,wpf,xaml,data-binding,C#,Wpf,Xaml,Data Binding,我有一个ListView,我选择它的数据并将其发送到DataGrid。我在DataGrid的quantity列中遇到问题,我想计算ListView项添加到所述DataGrid的次数(当选择同一项时,我当前显示一条成功消息)。我还想计算价格和数量,并将它们显示在DataGrid中一个名为“price”的列上 这是数据网格 将数据发送到的DataGrid如下所示: ListView双击事件后发送数据的代码如下: private void ItemGridView\u预览鼠标双击(对象发送器,

我有一个ListView,我选择它的数据并将其发送到DataGrid。我在DataGrid的quantity列中遇到问题,我想计算ListView项添加到所述DataGrid的次数(当选择同一项时,我当前显示一条成功消息)。我还想计算价格和数量,并将它们显示在DataGrid中一个名为“price”的列上

这是数据网格


将数据发送到的DataGrid如下所示:


ListView双击事件后发送数据的代码如下:

private void ItemGridView\u预览鼠标双击(对象发送器,鼠标按钮ventargs e)
{
var selectedItem=ItemGridView.selectedItem;
如果(!dGetItems.Items.Contains(selectedItem))
{
DGItems.Items.Add(选择编辑项);
}
其他的
{
utilityMethods.InformationMessage(“尝试成功添加项”);
}
}
我已经包括了屏幕截图来预览应用程序的外观,只是为了把问题放在上下文中


这是一个工作示例。我对您的xaml和绑定做了一些轻微的修改,以展示如何实现它。每当双击ListView中的项目时,它都会更新DataGrid中的Quantity和Total列

MyItem.cs:这是一个简单的模型来复制您的食物项目

namespace UpdateQuantityColumnTest
{
    public class MyItem
    {
        public string ItemName { get; set; }
        public double SellingPrice { get; set; }
    }
}
ListViewItemViewModel.cs:这是ListView中MyItem的视图模型表示形式

namespace UpdateQuantityColumnTest
{
    public class ListViewItemViewModel : ViewModelBase
    {
        public ListViewItemViewModel(MyItem model)
        {
            this.Model = model;
        }

        public MyItem Model { get; private set; }

        public string ItemName { get => this.Model.ItemName; set { this.Model.ItemName = value; OnPropertyChanged(); } }
        public string SellingPrice { get => this.Model.SellingPrice.ToString("c"); }
    }
}
DGItemViewModel:这是一种与DataGrid中MyItem略有不同的视图模型表示形式,但包括数量和总价

namespace UpdateQuantityColumnTest
{
    public class DGItemViewModel : ViewModelBase
    {
        private int quantity;

        public DGItemViewModel(MyItem model)
        {
            this.Model = model;
            this.quantity = 1; // always start at 1
        }

        public MyItem Model { get; private set; }
        public string ItemName { get => this.Model.ItemName; set { this.Model.ItemName = value; OnPropertyChanged(); } }
        public string SellingPrice { get => this.Model.SellingPrice.ToString("c"); }
        public int Quantity { get => this.quantity; set { this.quantity = value; OnPropertyChanged(); OnPropertyChanged(nameof(TotalPrice)); } }
        public string TotalPrice { get => (this.Model.SellingPrice * this.Quantity).ToString("c"); }
    }
}
ViewModelBase.cs:这是一个基类,它只处理INotifyPropertyChanged,以便在视图模型中某个属性值发生更改时更新UI

using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace UpdateQuantityColumnTest
{
    public class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
MainWindow.xaml:我做了一些轻微的更改,主要是对您的绑定进行了更改,以便我的示例能够正常工作

<Window x:Class="UpdateQuantityColumnTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <ListView x:Name="ItemGridView" ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" PreviewMouseDoubleClick="ItemGridView_PreviewMouseDoubleClick">
            <ListView.View>
                <GridView AllowsColumnReorder="False">
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Horizontal">
                                    <Grid Margin="5">
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto" />
                                        </Grid.RowDefinitions>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="Auto" />
                                        </Grid.ColumnDefinitions>

                                        <Image Source="{Binding ItemImage}" Width="225" Height="157" Stretch="UniformToFill" StretchDirection="DownOnly" />
                                        <StackPanel Margin="0,100,0,0">
                                            <Border Margin="-0,-7,0,0"  Height="63" Width="225" Background="{x:Null}" BorderBrush="{x:Null}" BorderThickness="0">
                                                <TextBlock Margin="8" FontWeight="Heavy" Foreground="White" FontSize="16" Text="{Binding ItemName}"/>
                                            </Border>
                                            <TextBlock Margin="15,-28,0,0" FontSize="15" Text="{Binding SellingPrice}" Foreground="White"/>
                                        </StackPanel>
                                    </Grid>
                                </StackPanel>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
        <DataGrid x:Name="DGItems" ItemsSource="{Binding CheckoutItems}" VerticalAlignment="Top" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Grid.Row="1" MinHeight="350" MaxHeight="350" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" CanUserSortColumns="True" CanUserAddRows="False" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Items" Binding="{Binding ItemName}" />
                <DataGridTextColumn Header="Cost" Binding="{Binding SellingPrice}" />
                <DataGridTextColumn Header="Qty"  Binding="{Binding Quantity}"/>
                <DataGridTextColumn Header="Total"  Binding="{Binding TotalPrice}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Input;

namespace UpdateQuantityColumnTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private ObservableCollection<ListViewItemViewModel> items;
        private ObservableCollection<DGItemViewModel> checkoutItems;

        public MainWindow()
        {
            InitializeComponent();
            this.Loaded += OnLoaded;
            this.DataContext = this;
        }

        public ObservableCollection<ListViewItemViewModel> Items
        {
            get
            {
                if (this.items == null)
                    this.items = new ObservableCollection<ListViewItemViewModel>();
                return this.items;
            }
        }

        public ObservableCollection<DGItemViewModel> CheckoutItems
        {
            get
            {
                if (this.checkoutItems == null)
                    this.checkoutItems = new ObservableCollection<DGItemViewModel>();
                return this.checkoutItems;
            }
        }

        private void OnLoaded(object sender, RoutedEventArgs e)
        {
            // Populate with dummy data
            this.Items.Add(new ListViewItemViewModel(new MyItem() { ItemName = "Beef Steak", SellingPrice = 1000 }));
            this.Items.Add(new ListViewItemViewModel(new MyItem() { ItemName = "Bacon Brie", SellingPrice = 1200 }));
            this.Items.Add(new ListViewItemViewModel(new MyItem() { ItemName = "Bread and Sausage", SellingPrice = 700 }));
        }

        private void ItemGridView_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            var selectedItem = ItemGridView.SelectedItem as ListViewItemViewModel;
            var checkoutItem = this.CheckoutItems.SingleOrDefault(o => o.ItemName == selectedItem.ItemName);

            if (checkoutItem == null)
            {
                this.CheckoutItems.Add(new DGItemViewModel(selectedItem.Model));
            }
            else
            {
                //utilityMethods.InformationMessage("Attempted to add item successfully");
                checkoutItem.Quantity++;
            }

        }
    }
}

MainWindow.xaml.cs:完成所有工作的代码

<Window x:Class="UpdateQuantityColumnTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <ListView x:Name="ItemGridView" ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" PreviewMouseDoubleClick="ItemGridView_PreviewMouseDoubleClick">
            <ListView.View>
                <GridView AllowsColumnReorder="False">
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Horizontal">
                                    <Grid Margin="5">
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto" />
                                        </Grid.RowDefinitions>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="Auto" />
                                        </Grid.ColumnDefinitions>

                                        <Image Source="{Binding ItemImage}" Width="225" Height="157" Stretch="UniformToFill" StretchDirection="DownOnly" />
                                        <StackPanel Margin="0,100,0,0">
                                            <Border Margin="-0,-7,0,0"  Height="63" Width="225" Background="{x:Null}" BorderBrush="{x:Null}" BorderThickness="0">
                                                <TextBlock Margin="8" FontWeight="Heavy" Foreground="White" FontSize="16" Text="{Binding ItemName}"/>
                                            </Border>
                                            <TextBlock Margin="15,-28,0,0" FontSize="15" Text="{Binding SellingPrice}" Foreground="White"/>
                                        </StackPanel>
                                    </Grid>
                                </StackPanel>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
        <DataGrid x:Name="DGItems" ItemsSource="{Binding CheckoutItems}" VerticalAlignment="Top" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Grid.Row="1" MinHeight="350" MaxHeight="350" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" CanUserSortColumns="True" CanUserAddRows="False" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Items" Binding="{Binding ItemName}" />
                <DataGridTextColumn Header="Cost" Binding="{Binding SellingPrice}" />
                <DataGridTextColumn Header="Qty"  Binding="{Binding Quantity}"/>
                <DataGridTextColumn Header="Total"  Binding="{Binding TotalPrice}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Input;

namespace UpdateQuantityColumnTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private ObservableCollection<ListViewItemViewModel> items;
        private ObservableCollection<DGItemViewModel> checkoutItems;

        public MainWindow()
        {
            InitializeComponent();
            this.Loaded += OnLoaded;
            this.DataContext = this;
        }

        public ObservableCollection<ListViewItemViewModel> Items
        {
            get
            {
                if (this.items == null)
                    this.items = new ObservableCollection<ListViewItemViewModel>();
                return this.items;
            }
        }

        public ObservableCollection<DGItemViewModel> CheckoutItems
        {
            get
            {
                if (this.checkoutItems == null)
                    this.checkoutItems = new ObservableCollection<DGItemViewModel>();
                return this.checkoutItems;
            }
        }

        private void OnLoaded(object sender, RoutedEventArgs e)
        {
            // Populate with dummy data
            this.Items.Add(new ListViewItemViewModel(new MyItem() { ItemName = "Beef Steak", SellingPrice = 1000 }));
            this.Items.Add(new ListViewItemViewModel(new MyItem() { ItemName = "Bacon Brie", SellingPrice = 1200 }));
            this.Items.Add(new ListViewItemViewModel(new MyItem() { ItemName = "Bread and Sausage", SellingPrice = 700 }));
        }

        private void ItemGridView_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            var selectedItem = ItemGridView.SelectedItem as ListViewItemViewModel;
            var checkoutItem = this.CheckoutItems.SingleOrDefault(o => o.ItemName == selectedItem.ItemName);

            if (checkoutItem == null)
            {
                this.CheckoutItems.Add(new DGItemViewModel(selectedItem.Model));
            }
            else
            {
                //utilityMethods.InformationMessage("Attempted to add item successfully");
                checkoutItem.Quantity++;
            }

        }
    }
}
使用System.Collections.ObjectModel;
使用System.Linq;
使用System.Windows;
使用System.Windows.Input;
命名空间UpdateQuantityColumnTest
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
私人可观测收集项目;
私人可观察到的集合签出项目;
公共主窗口()
{
初始化组件();
此.Loaded+=已加载;
this.DataContext=this;
}
公共可观测收集项目
{
得到
{
if(this.items==null)
this.items=新的ObservableCollection();
归还此物品;
}
}
公共可观测集合签出项
{
得到
{
if(this.checkoutItems==null)
this.checkoutItems=新的ObservableCollection();
返回此文件。签出项目;
}
}
已加载专用void(对象发送方,RoutedEventArgs e)
{
//用虚拟数据填充
添加(新的ListViewItemViewModel(新的MyItem(){ItemName=“Beef Steak”,SellingPrice=1000}));
添加(新的ListViewItemViewModel(新的MyItem(){ItemName=“Bacon Brie”,SellingPrice=1200}));
Add(新的ListViewItemViewModel(新的MyItem(){ItemName=“面包和香肠”,SellingPrice=700}));
}
私有void ItemGridView_预览鼠标双击(对象发送器,鼠标按钮ventargs e)
{
var selectedItem=ItemGridView.selectedItem作为ListViewItemViewModel;
var checkoutItem=this.CheckoutItems.SingleOrDefault(o=>o.ItemName==selec