Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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
WPF C#Datagrid不添加行,除非我有另一个控件来获取焦点_C#_Wpf_Xaml_Datagrid - Fatal编程技术网

WPF C#Datagrid不添加行,除非我有另一个控件来获取焦点

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

我有一个空的datagrid绑定到一个可观察的自定义对象集合。当我试图通过UI创建新行时,我会得到一个新行,但它似乎永远不会提交新行,除非我有另一个控件让UI关注。如果没有其他控件,我只需在新行的每一列中进行制表,这是一个无止境的循环。如果我将Textblock更改为textbox,那么我可以使用tab键切换到textbox并获得新行

下面是我所有的代码和XAML

XAML:


测试
代码隐藏:

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}}"