C#WPF NumericUpDown值更改事件以通知已修改的行

时间:2018-07-24 01:19:40

标签: c# wpf datagrid mahapps.metro numericupdown

在此先感谢您提供的任何帮助!

我正在一个项目中,该项目使用MahApps NumericUpDown定位.NET Framework 4.6来实现C#WPF表单。对我的应用程序的简要描述是,当用户按下表单上的按钮时,数据将根据他们已配置的表单上的参数从数据库加载到DataGrid的ItemsSource(以自定义对象列表的形式) (大小,颜色,复杂程度等)。

我的问题是,当我的NumericUpDown ValueChanged事件处理程序被触发时,我不知道如何识别特别是哪个DataGrid行被更改,因为当我处理ValueChanged事件时,我的DataGrid无法反映活动行( SelectedIndex / Item),但它为null(DataGrid中的每一行都反映了您希望添加到购物车的另一个​​项目,因此每一行都有一个Item ID(文本字段),Item Description(文本字段),Item Quantity( NumericUpDown),商品价格(基于商品基本价格和数量的文本字段),添加到购物车(按钮)等。

我需要做的就是在更改NumericUpDown值时更新该特定DataGrid行中的另一个控件(文本)。 NumericUpDown控件负责您想要的特定项目的数量。以这种情况为例:更改NumericUpDown值,我必须更新该行的另一列,以根据用户将NumericUpDown值调整为(var totalPrice = NumericUpDown.Value * DbQueryResultsForCriteria.ItemPrice )。

这是MainWindow.xaml中的NumericUpDown代码; ItemResult是我的自定义对象的列表,但是我不确定我是否正确实现了INotifyPropertyChanged。

<DataGridTemplateColumn Header="TotalQty">
                                <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                        <controls:NumericUpDown Name="Qty" ValueChanged="OnQtyChanged" Value="{Binding ItemResult, UpdateSourceTrigger=PropertyChanged,RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
                                    </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>

ItemResult.cs

public class ItemResultModel { }

public class ItemResult : INotifyPropertyChanged
{
    public ItemResult()
    {
    }


    public ItemResult(string itemId, string itemName, decimal itemPrice)
    {
        ItemId = itemId;
        ItemName = itemName;
        ItemPrice = itemPrice.ToString("F");
    }

    public string ItemId { get; set; }
    public string ItemName { get; set; }

    private string _itemQuantity;
    public string ItemQty
    {
        get => _itemQuantity;
        set
        {
            _itemQuantity = value;
            OnPropertyChanged(nameof(_itemQuantity));
        }
    }
    public string ItemPrice { get; set; }
    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

}

MainWindow.xaml.cs

       // The numeric up down control for the quanTITY has changed
    private void OnQtyChanged(object sender, RoutedPropertyChangedEventArgs<double?> routedPropertyChangedEventArgs)
    {
        var item = ItemDataGrid.SelectedItem;       // returns null on the first run, otherwise returns the previously selected item
        var value = ItemDataGrid.SelectedValue;     // returns null on the first run, otherwise returns the previously selected value

    }

我感觉非常接近解决方案!如果遗漏了您可能需要的任何内容,我深表歉意。

TLDR :如何确定DataGrid中NumericUpDown触发了ValueChanged事件的哪一行,以便可以更新该行的另一列? >

我能够通过实施DataGridNumericUpDownColumn解决此问题。例如,在我的MainWindow.xaml中,现在有了以下内容:

controls:DataGridNumericUpDownColumn Header="Qty" Minimum="1" HideUpDownButtons="False" Binding="{Binding ItemQty,UpdateSourceTrigger=PropertyChanged}" />

非常感谢!

0 个答案:

没有答案