在此先感谢您提供的任何帮助!
我正在一个项目中,该项目使用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}" />
非常感谢!