WPF C#Datagrid不添加行,除非我有另一个控件来获取焦点
我有一个空的datagrid绑定到一个可观察的自定义对象集合。当我试图通过UI创建新行时,我会得到一个新行,但它似乎永远不会提交新行,除非我有另一个控件让UI关注。如果没有其他控件,我只需在新行的每一列中进行制表,这是一个无止境的循环。如果我将Textblock更改为textbox,那么我可以使用tab键切换到textbox并获得新行 下面是我所有的代码和XAML XAML:WPF C#Datagrid不添加行,除非我有另一个控件来获取焦点,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,我有一个空的datagrid绑定到一个可观察的自定义对象集合。当我试图通过UI创建新行时,我会得到一个新行,但它似乎永远不会提交新行,除非我有另一个控件让UI关注。如果没有其他控件,我只需在新行的每一列中进行制表,这是一个无止境的循环。如果我将Textblock更改为textbox,那么我可以使用tab键切换到textbox并获得新行 下面是我所有的代码和XAML XAML: 测试 代码隐藏: using System; using System.Collections.Generic; u
测试
代码隐藏:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using WPFDatagridTesting.CustomObjects;
namespace WPFDatagridTesting
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
MultiplierObservableCollection mycollection = new MultiplierObservableCollection();
System.Windows.Data.CollectionViewSource MultiplierCollection;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
try
{
mycollection = new MultiplierObservableCollection();
mycollection.TotalResultsChanged +=mycollection_TotalResultsChanged;
MultiplierCollection = ((System.Windows.Data.CollectionViewSource)(this.FindResource("MultiplierCollection")));
MultiplierCollection.Source = mycollection.MultiplierClassList;
}
catch (Exception)
{
throw;
}
}
void mycollection_TotalResultsChanged(object sender, MultiplierCollectionResultsChangedEventArgs e)
{
this.NumberTotal.Text = e.MultiplierResults.ToString();
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Collections.ObjectModel;
使用System.Linq;
使用系统文本;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Data;
使用System.Windows.Documents;
使用System.Windows.Input;
使用System.Windows.Media;
使用System.Windows.Media.Imaging;
使用System.Windows.Navigation;
使用System.Windows.Shapes;
使用WPFDatagridTesting.CustomObjects;
命名空间WPFDatagridTesting
{
///
///MainWindow.xaml的交互逻辑
///
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
MultiplierObservableCollection mycollection=新的MultiplierObservableCollection();
System.Windows.Data.CollectionViewSource MultiplierCollection;
已加载私有无效窗口(对象发送器、路由目标)
{
尝试
{
mycollection=新的乘数ObservableCollection();
mycollection.TotalResultsChanged+=mycollection\u TotalResultsChanged;
MultiplierCollection=((System.Windows.Data.CollectionViewSource)(this.FindResource(“MultiplierCollection”));
multiplerCollection.Source=mycollection.multiplerClassList;
}
捕获(例外)
{
投掷;
}
}
void mycollection\u TotalResultsChanged(对象发送方,MultiplerCollectionResultsChangedEventArgs e)
{
this.NumberTotal.Text=e.multiplerResults.ToString();
}
}
}
自定义对象:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
namespace WPFDatagridTesting.CustomObjects
{
class MultiplierClass : INotifyPropertyChanged
{
protected virtual void Changed(string PropertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(PropertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public MultiplierClass()
{
}
private int _BaseNumber;
public int BaseNumber
{
get
{
return _BaseNumber;
}
set
{
if (_BaseNumber != value)
{
_BaseNumber = value;
Changed("BaseNumber");
Changed("Result");
}
}
}
private int _Multiplier;
public int Multiplier
{
get
{
return _Multiplier;
}
set
{
if (_Multiplier != value)
{
_Multiplier = value;
Changed("Multiplier");
Changed("Result");
}
}
}
public int Result
{
get
{
return _BaseNumber * _Multiplier;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
namespace WPFDatagridTesting.CustomObjects
{
class MultiplierObservableCollection : ObservableCollection<MultiplierClass>
{
public ObservableCollection<MultiplierClass> MultiplierClassList { get; set; }
public MultiplierObservableCollection() : base()
{
MultiplierClassList = new ObservableCollection<MultiplierClass>();
MultiplierClassList.CollectionChanged += MultiplierClassList_CollectionChanged;
}
void MultiplierClassList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
{
foreach (MultiplierClass item in e.NewItems)
{
//Added items
item.PropertyChanged += myNewClass_PropertyChanged;
}
}
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
{
MultiplierClass myNewClass = new MultiplierClass();
myNewClass.PropertyChanged -= myNewClass_PropertyChanged;
}
myNewClass_PropertyChanged(this, null);
}
void myNewClass_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
MultiplierCollectionResultsChangedEventArgs myEventArgs = new MultiplierCollectionResultsChangedEventArgs();
myEventArgs.MultiplierResults = this.MultiplierClassList.Sum(mc => mc.Result);
EventHandler<MultiplierCollectionResultsChangedEventArgs> handler = TotalResultsChanged;
if (handler != null)
{
handler(this, myEventArgs);
}
}
public event EventHandler<MultiplierCollectionResultsChangedEventArgs> TotalResultsChanged;
}
public class MultiplierCollectionResultsChangedEventArgs : EventArgs
{
public int MultiplierResults { get; set; }
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统组件模型;
命名空间WPFDatagridTesting.CustomObjects
{
类乘数类:INotifyPropertyChanged
{
受保护的虚拟无效已更改(字符串PropertyName)
{
PropertyChangedEventHandler处理程序=PropertyChanged;
if(处理程序!=null)
{
处理程序(这是新的PropertyChangedEventArgs(PropertyName));
}
}
公共事件属性更改事件处理程序属性更改;
公共乘数类()
{
}
专用int_基号;
公共整数基数
{
得到
{
返回_BaseNumber;
}
设置
{
如果(_BaseNumber!=值)
{
_BaseNumber=值;
变更(“基准号”);
变更(“结果”);
}
}
}
私有整数乘法器;
公共整数乘法器
{
得到
{
返回乘数;
}
设置
{
如果(_乘数!=值)
{
_乘数=价值;
更改(“乘数”);
变更(“结果”);
}
}
}
公共整数结果
{
得到
{
返回_BaseNumber*_乘数;
}
}
}
}
使用制度;
使用System.Collections.Generic;
使用System.Collections.ObjectModel;
使用System.Linq;
使用系统文本;
命名空间WPFDatagridTesting.CustomObjects
{
类乘数ObservaleCollection:ObservaleCollection
{
公共ObservableCollection MultiperClassList{get;set;}
公共乘数ObservableCollection():base()
{
multiplerClassList=新的ObservableCollection();
MultiplerClassList.CollectionChanged+=MultiplerClassList\u CollectionChanged;
}
void multiplerClassList\u CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if(e.Action==System.Collections.Specialized.NotifyCollectionChangedAction.Add)
{
foreach(e.NewItems中的multiplerClass项)
{
//新增项目
item.PropertyChanged+=myNewClass\u PropertyChanged;
}
}
if(e.Action==System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
{
MultiplierClass myNewClass=新的MultiplierClass();
myNewClass.PropertyChanged-=myNewClass\u PropertyChanged;
}
myNewClass_PropertyChanged(此为空);
}
void myNewClass_PropertyChanged(对象发送方,System.ComponentModel.PropertyChangedEventArgs e)
{
MultiplierCollectionResultsChangedEventArgs myEventArgs=新的MultiplierCollectionResultsChangedEventArgs();
myEventArgs.multilierResults=this.multilierClassList.Sum(mc=>mc.Result);
EventHandler=TotalResults
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
namespace WPFDatagridTesting.CustomObjects
{
class MultiplierClass : INotifyPropertyChanged
{
protected virtual void Changed(string PropertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(PropertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public MultiplierClass()
{
}
private int _BaseNumber;
public int BaseNumber
{
get
{
return _BaseNumber;
}
set
{
if (_BaseNumber != value)
{
_BaseNumber = value;
Changed("BaseNumber");
Changed("Result");
}
}
}
private int _Multiplier;
public int Multiplier
{
get
{
return _Multiplier;
}
set
{
if (_Multiplier != value)
{
_Multiplier = value;
Changed("Multiplier");
Changed("Result");
}
}
}
public int Result
{
get
{
return _BaseNumber * _Multiplier;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
namespace WPFDatagridTesting.CustomObjects
{
class MultiplierObservableCollection : ObservableCollection<MultiplierClass>
{
public ObservableCollection<MultiplierClass> MultiplierClassList { get; set; }
public MultiplierObservableCollection() : base()
{
MultiplierClassList = new ObservableCollection<MultiplierClass>();
MultiplierClassList.CollectionChanged += MultiplierClassList_CollectionChanged;
}
void MultiplierClassList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
{
foreach (MultiplierClass item in e.NewItems)
{
//Added items
item.PropertyChanged += myNewClass_PropertyChanged;
}
}
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
{
MultiplierClass myNewClass = new MultiplierClass();
myNewClass.PropertyChanged -= myNewClass_PropertyChanged;
}
myNewClass_PropertyChanged(this, null);
}
void myNewClass_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
MultiplierCollectionResultsChangedEventArgs myEventArgs = new MultiplierCollectionResultsChangedEventArgs();
myEventArgs.MultiplierResults = this.MultiplierClassList.Sum(mc => mc.Result);
EventHandler<MultiplierCollectionResultsChangedEventArgs> handler = TotalResultsChanged;
if (handler != null)
{
handler(this, myEventArgs);
}
}
public event EventHandler<MultiplierCollectionResultsChangedEventArgs> TotalResultsChanged;
}
public class MultiplierCollectionResultsChangedEventArgs : EventArgs
{
public int MultiplierResults { get; set; }
}
}
ItemsSource="{Binding Source={StaticResource MultiplierCollection}}"
ItemsSource="{Binding Source={StaticResource MultiplierCollection, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True}}"