【问题标题】:Observable Collection sum the colunm as row added WPFObservablecollection 将列作为行添加 WPF
【发布时间】:2017-10-21 11:16:17
【问题描述】:

我正在做项目。我使用数据网格填充空的“可观察集合”,它按预期工作。主要问题是我想在输入时计算“产品”的“总价格”数据网格视图。由于“Pricesrc”绑定到需要显示“总价”的文本框。现在我如何完成这项任务。将不胜感激。

这是我的产品类别。

public class product_data
{
   private String _Name;
   private String _Brand;
   private String _Price;

    public string Name
    {
        get { return _Name; }
        set { _Name = value; }
    }

    public string Brand
    {
        get { return _Brand; }
        set { _Brand = value; }
    }

    public string Price
    {
        get { return _Price; }
        set
        {
            _Price = value;
        }
    }
}

这是我的 ViewModel 类。

 public class ViewModel:INotifyPropertyChanged
{


    public int Pricesrc
    {
        set;get;
    }
    public ObservableCollection<product_data> listsrc;
    public ObservableCollection<product_data> product_data
    {
        get { return listsrc; }
        set
        {
            listsrc = value; 
        }
    }
    public ViewModel()
    {
        listsrc = new ObservableCollection<Pages.Product.product_data>();
    }

     public  event PropertyChangedEventHandler PropertyChanged;

    public void onPropertyChanged(string prop)
    {
        PropertyChanged?.Invoke(this,new  PropertyChangedEventArgs(prop));
    }
}

这是我的 XAML:

<Grid  Background="#C82C2C2C">
    <StackPanel Orientation="Vertical" Background="LightGray" Margin="150,60,150,60">
        <StackPanel.Effect>
            <DropShadowEffect BlurRadius="44"/>
        </StackPanel.Effect>
        <StackPanel Background="#FF886AF0" Height="80">
            <TextBlock Text="Bill" FontSize="25" FontWeight="SemiBold" HorizontalAlignment="Center" Margin="0,20,0,0" Foreground="#FFE6E6E6"></TextBlock>
        </StackPanel>
        <StackPanel  Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,35,0,0">
            <TextBox x:Name="txt_Total" ToolTip="Total" Text="{Binding Pricesrc}" Height="50" Background="White" Foreground="#FFB6B2B2" BorderBrush="{x:Null}" BorderThickness="3" HorizontalAlignment="Center" Width="630" FontWeight="DemiBold" FontSize="16" VerticalContentAlignment="Center" Style="{DynamicResource flat_ui_textbox}" GotFocus="textboxes_gotFocus" LostFocus="textboxes_lostFocus"/>
        </StackPanel>
        <StackPanel  Orientation="Horizontal" HorizontalAlignment="Center" >
            <TextBox x:Name="txt_advance" ToolTip="Advance" Text="Advance" Height="50" Background="White" Foreground="#FFB6B2B2" BorderBrush="{x:Null}" BorderThickness="3" HorizontalAlignment="Center" Width="315" FontWeight="DemiBold" FontSize="16" VerticalContentAlignment="Center" Style="{DynamicResource flat_ui_textbox}" GotFocus="textboxes_gotFocus" LostFocus="textboxes_lostFocus"/>
            <TextBox x:Name="txt_pending" ToolTip="Pending" Text="Pending" Height="50" Background="White" Foreground="#FFB6B2B2" BorderBrush="{x:Null}" BorderThickness="3" HorizontalAlignment="Center" Width="315" FontWeight="DemiBold" FontSize="16" VerticalContentAlignment="Center" Style="{DynamicResource flat_ui_textbox}" GotFocus="textboxes_gotFocus" LostFocus="textboxes_lostFocus"/>
        </StackPanel>
        <StackPanel  Orientation="Horizontal" HorizontalAlignment="Center" >
            <TextBox x:Name="txt_date" ToolTip="Date" Text="Date" Height="50" Background="White" Foreground="#FFB6B2B2" BorderBrush="{x:Null}" BorderThickness="3" HorizontalAlignment="Center" Width="475" FontWeight="DemiBold" FontSize="16" VerticalContentAlignment="Center" Style="{DynamicResource flat_ui_textbox}" GotFocus="textboxes_gotFocus" LostFocus="textboxes_lostFocus"/>
            <TextBlock Margin="48,0,0,0" Text="Is Paid" VerticalAlignment="Center" FontWeight="Bold" FontSize="18" Foreground="#FF818181"/>
            <CheckBox Margin="16,0,0,0" Height="35" Width="35"  BorderBrush="{x:Null}" Style="{DynamicResource flat_ui_checkboxes}"></CheckBox>
        </StackPanel>
        <GroupBox Header="Product" Margin="150,35,150,0" Foreground="#FF7E7E7E" FontSize="24" FontWeight="DemiBold">
            <DataGrid x:Name="product_grid" ItemsSource="{Binding product_data,Mode=TwoWay}"  HorizontalAlignment="Center"  Margin="0,0,0,0" Height=" 350"   Background="White" Width="973.5" AutoGenerateColumns="False" CanUserAddRows="True">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Name" Binding="{Binding Name,Mode=TwoWay}" ></DataGridTextColumn>
                    <DataGridTextColumn Header="Brand" Binding="{Binding Brand,Mode=TwoWay}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Price" Binding="{Binding Price,Mode=TwoWay}"></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </GroupBox>
        <Button Width="200" Height="55" Background="#FF2DCC70" Margin="0,0,0,0" Template="{DynamicResource flat_add_green_btn}" Command="{Binding Add_Customer_Command}" Click="Button_Click" />
    </StackPanel>
</Grid>

【问题讨论】:

    标签: c# wpf data-binding datagrid observablecollection


    【解决方案1】:

    首先,当您的Pricesrc 更改时,您应该使用PropertyChanged 事件:

    private int _Pricesrc;
    public int Pricesrc
    {
        get { return _Pricesrc; }
        set { _Pricesrc = value; onPropertyChanged(nameof(Pricesrc)); }
    }
    

    这是必需的,因此当您设置总绑定时会更新。

    现在,为了在您的集合更改(添加或删除项目时)更新Pricesrc,您应该处理准确通知该集合的事件 - CollectionChanged https://msdn.microsoft.com/en-us/library/ms653375(v=vs.110).aspx

    在构造函数中添加事件处理程序:

    public ViewModel()
    {
        listsrc = new ObservableCollection<Pages.Product.product_data>();
        listsrc.CollectionChanged += OnCollectionChanged;
    }
    
    private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        Pricesrc = listsrc.Sum(prod => prod.Price);
    }
    

    编辑:如果你想在现有产品的价格发生变化时更新总价,你应该在 product_data 类中实现 INotifyPropertyChanged 并在 Price 属性发生变化时引发事件,类似于我在这里对 Pricesrc 所做的事情财产。然后处理该事件并更新总价。

    【讨论】:

    • 感谢您的回复,它解决了问题,但剩下的一件事是“未添加网格价格的最后一行......任何解决方案??......你能解释一下“Pricesrc = listsrc.Sum(prod => prod.Price)" 真的可以...再次感谢。
    • 另外,当我点击空列时,会触发事件,但添加行时不会触发。
    • 哦,我没有看到 Price 属性是字符串。求和(或完全更改属性类型)时,应将其转换为适当的数字类型(如 int 或 double)。 Sum 基本上对给定属性的值求和,而 IEnumerable(即列表、数组等)。
    猜你喜欢
    • 1970-01-01
    • 2023-01-17
    • 2018-11-07
    • 1970-01-01
    • 2012-05-30
    • 2011-05-07
    • 2013-01-15
    • 1970-01-01
    • 2018-12-23
    相关资源
    最近更新 更多