Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.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
C# eld_A_1”,FieldB=“Field_B_1”,Edited=UpdateAction}, 新的可编辑购买{FieldA=“Field_A_2”,FieldB=“Field_B_2”,Edited=UpdateAction} }; Purchases.CollectionChanged+=Purchases\u CollectionChanged; 私有无效购买\u CollectionChanged(对象发送方,NotifyCollectionChangedEventArgs e) { 如果(如NewItems!=null) foreach(e.NewItems中的可编辑采购项目) item.Edited=UpdateAction; } 作废更新操作(采购) { //保存XML }_C#_Wpf_Datagrid - Fatal编程技术网

C# eld_A_1”,FieldB=“Field_B_1”,Edited=UpdateAction}, 新的可编辑购买{FieldA=“Field_A_2”,FieldB=“Field_B_2”,Edited=UpdateAction} }; Purchases.CollectionChanged+=Purchases\u CollectionChanged; 私有无效购买\u CollectionChanged(对象发送方,NotifyCollectionChangedEventArgs e) { 如果(如NewItems!=null) foreach(e.NewItems中的可编辑采购项目) item.Edited=UpdateAction; } 作废更新操作(采购) { //保存XML }

C# eld_A_1”,FieldB=“Field_B_1”,Edited=UpdateAction}, 新的可编辑购买{FieldA=“Field_A_2”,FieldB=“Field_B_2”,Edited=UpdateAction} }; Purchases.CollectionChanged+=Purchases\u CollectionChanged; 私有无效购买\u CollectionChanged(对象发送方,NotifyCollectionChangedEventArgs e) { 如果(如NewItems!=null) foreach(e.NewItems中的可编辑采购项目) item.Edited=UpdateAction; } 作废更新操作(采购) { //保存XML },c#,wpf,datagrid,C#,Wpf,Datagrid,这提供了从初始化和新创建的所有EditablePurchase元素捕获对Edit的调用。确保在initializer中设置了Editated属性。这是WPF的耻辱。NoDataGrid.CellEditEnded事件?荒谬,到目前为止我还不知道。这是一个inte还有一个问题 正如Fratyx提到的,你可以打电话 dataGrid.CommitEdit(DataGridEditingUnit.Row, true); 在代码隐藏的CellEditEnding方法中。虽然它可以工作,但我发现它非常难

这提供了从初始化和新创建的所有EditablePurchase元素捕获对Edit的调用。确保在initializer中设置了Editated属性。这是WPF的耻辱。No
DataGrid.CellEditEnded
事件?荒谬,到目前为止我还不知道。这是一个inte还有一个问题

正如Fratyx提到的,你可以打电话

dataGrid.CommitEdit(DataGridEditingUnit.Row, true);
在代码隐藏的CellEditEnding方法中。虽然它可以工作,但我发现它非常难看。这不仅是因为有代码隐藏(可以使用一种行为来绕过它),而且您的ViewModel
CellEditEndingMethod
将被调用两次,一次调用没有充分的理由,因为编辑尚未提交

如果尚未实现,我可能会选择在您的Purchase类中实现
INotifyPropertyChanged
(我建议使用,以便您可以在一行上再次写入属性),并使用
PropertyChanged
事件:

public MyViewModel()
{
    Purchases = new ObservableCollection<Purchase>();
    Purchases.CollectionChanged += Purchases_CollectionChanged;
}

private void Purchases_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    if (e.NewItems != null)
        foreach (Purchase item in e.NewItems)
            item.PropertyChanged += Purchase_PropertyChanged;

    if (e.OldItems != null)
        foreach (Purchase item in e.OldItems)
            item.PropertyChanged -= Purchase_PropertyChanged;
}

private void Purchase_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    // save the xml...
}
publicMyViewModel()
{
采购=新的可观察集合();
Purchases.CollectionChanged+=Purchases\u CollectionChanged;
}
私有无效购买\u CollectionChanged(对象发送方,NotifyCollectionChangedEventArgs e)
{
如果(如NewItems!=null)
foreach(e.NewItems中的采购项目)
item.PropertyChanged+=采购\物业变更;
如果(例如,OldItems!=null)
foreach(e.OldItems中的采购项目)
item.PropertyChanged-=采购\物业变更;
}
私有无效购买\u PropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
//保存xml。。。
}

在DataGrid更改集合之前,您不会获得任何CollectionChanged事件。在提交数据集之前,不会发生这种情况。 如果在一个单元格中按“Enter”键,则会在实际数据集的一种副本中更改此单元格的值。因此,可以通过回滚跳过更改。只有在完成一行后(例如,通过更改到另一行或直接提交),更改后的数据才会写回原始数据。然后,绑定将被更新,集合为c绞死。 如果您想要一个单元格一个单元格地更新,您必须按照我建议的代码强制提交。
但是,如果您想拥有一个没有代码隐藏的纯MVVM解决方案,您必须满足于DataGrid的预期行为。这就是在行完成后更新。

好的,我会检查它并让您知道谢谢您的回复&欢迎使用StackOverflow!一个好答案的提示:有关更多信息的链接非常棒,但总是b最好将相关代码直接粘贴到您的答案中——StackOverflow的目标是长期在这里,而参考链接有移动或消失的方式。对您最好!@Fratyx:CollectionChanged仅用于添加/删除购买中更改的属性。我建议您在申请之前尝试该代码或更详细地研究它g它不起作用。IEditableObject可能是替换“保存”按钮的好方法。@adabyron:是的,你说得对。我只是想理解为什么Vishals代码中没有触发CollectionChanged。但是现在我看到
Purchases.CollectionChanged+=Purchases\u CollectionChanged
似乎太晚了,因为没有填写购买内容所以顺序应该是:create(initialize),添加事件处理程序,填充项。抱歉,我无法检查您的答案。我的项目发生了一些问题。例如,如果我更改了任何对象的背景,我可以在设计时看到这些更改,但在运行时看不到这些更改。我想Windows已缓存了我的项目。我已重新启动计算机。但此问题仍然存在。哦…很抱歉,出现了问题以上评论。我刚刚清理了解决方案并重新构建了它,现在它运行良好。现在,我将检查您的代码。
Purchases\u CollectionChanged
从未被触发。您如何填充购买?请让我看看您的代码。我已经更新了我的问题。请看一看。好的。我想坚持使用MVVM模式。我真正想做的是什么y want是一个在所有行上都有编辑按钮的datGrid。当我单击该编辑按钮时,其内容应更改为“保存”,并且我希望所有列都处于编辑模式。当用户完成编辑后,他应单击“保存”按钮,并将其保存到XML文件。您可以显示此示例吗?抱歉,我认为您确实需要逐个单元格提交。我更新了我的第一篇帖子。也许这会对你有所帮助。
public ICommand CellEditEndingCommand { get; set; }
private void CellEditEndingMethod(object obj)
{
    XDocument xmlPurchases = XDocument.Load(DirectoryPaths.DataDirectory + "Purchases.xml");
    var currentPurchaseInData = (from purchase in xmlPurchases.Element("Purchases").Elements("Purchase")
                                 where Convert.ToInt32(purchase.Attribute("Id").Value) == ServiceLocator.Instance.SelectedPurchase.Id
                                 select purchase).FirstOrDefault();

    currentPurchaseInData.SetElementValue("CreditorId", ServiceLocator.Instance.SelectedPurchase.Creditor.Id);
    currentPurchaseInData.SetElementValue("AnimalId", ServiceLocator.Instance.SelectedPurchase.Animal.Id);
    currentPurchaseInData.SetElementValue("QuantityInLitre", ServiceLocator.Instance.SelectedPurchase.Litre);
    currentPurchaseInData.SetElementValue("FAT", ServiceLocator.Instance.SelectedPurchase.FAT);
    currentPurchaseInData.SetElementValue("RatePerLitre", ServiceLocator.Instance.SelectedPurchase.RatePerLitre);

    xmlPurchases.Save(DirectoryPaths.DataDirectory + "Purchases.xml");
}
Purchases = new ObservableCollection<Purchase>(
    from purchase in XDocument.Load(DirectoryPaths.DataDirectory + "Purchases.xml")
                              .Element("Purchases").Elements("Purchase")
    select new Purchase
    {
        Id = Convert.ToInt32(purchase.Attribute("Id").Value),
        Creditor = (
                        from creditor in XDocument.Load(DirectoryPaths.DataDirectory + "Creditors.xml")
                                                  .Element("Creditors").Elements("Creditor")
                        where creditor.Attribute("Id").Value == purchase.Element("CreditorId").Value
                        select new Creditor
                        {
                            Id = Convert.ToInt32(creditor.Attribute("Id").Value),
                            NameInEnglish = creditor.Element("NameInEnglish").Value,
                            NameInGujarati = creditor.Element("NameInGujarati").Value,
                            Gender = (
                                        from gender in XDocument.Load(DirectoryPaths.DataDirectory + @"Basic\Genders.xml")
                                                                .Element("Genders").Elements("Gender")
                                        where gender.Attribute("Id").Value == creditor.Element("GenderId").Value
                                        select new Gender
                                        {
                                            Id = Convert.ToInt32(gender.Attribute("Id").Value),
                                            Type = gender.Element("Type").Value,
                                            ImageData = gender.Element("ImageData").Value
                                        }
                                     ).FirstOrDefault(),
                            IsRegisteredMember = creditor.Element("IsRegisteredMember").Value == "Yes" ? true : false,
                            Address = creditor.Element("Address").Value,
                            City = creditor.Element("City").Value,
                            ContactNo1 = creditor.Element("ContactNo1").Value,
                            ContactNo2 = creditor.Element("ContactNo2").Value
                        }
                   ).FirstOrDefault(),
        Animal = (
                    from animal in XDocument.Load(DirectoryPaths.DataDirectory + @"Basic\Animals.xml")
                                            .Element("Animals").Elements("Animal")
                    where animal.Attribute("Id").Value == purchase.Element("AnimalId").Value
                    select new Animal
                    {
                        Id = Convert.ToInt32(animal.Attribute("Id").Value),
                        Type = animal.Element("Type").Value,
                        ImageData = animal.Element("ImageData").Value,
                        Colour = animal.Element("Colour").Value
                    }
                 ).FirstOrDefault(),
        Litre = Convert.ToDouble(purchase.Element("QuantityInLitre").Value),
        FAT = Convert.ToDouble(purchase.Element("FAT").Value),
        RatePerLitre = Convert.ToDouble(purchase.Element("RatePerLitre").Value)
    }
  );
class Purchase
{
    public string FieldA { get; set; }
    public string FieldB { get; set; }
}
class EditablePurchase : Purchase, IEditableObject
{
    public Action<Purchase> Edited { get; set; }

    private int numEdits;
    public void BeginEdit()
    {
        numEdits++;
    }

    public void CancelEdit()
    {
        numEdits--;
    }

    public void EndEdit()
    {
        if (--numEdits == 0)
        {
            if (Edited != null)
                Edited(this);
        }
    }
}
   ObservableCollection<EditablePurchase> Purchases = new ObservableCollection<EditablePurchase>()
        {
            new EditablePurchase {FieldA = "Field_A_1", FieldB = "Field_B_1", Edited = UpdateAction},
            new EditablePurchase {FieldA = "Field_A_2", FieldB = "Field_B_2", Edited = UpdateAction}
        };

    Purchases.CollectionChanged += Purchases_CollectionChanged;

    private void Purchases_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
            foreach (EditablePurchase item in e.NewItems)
                item.Edited = UpdateAction;
    }

    void UpdateAction(Purchase purchase)
    {
        // Save XML
    }
dataGrid.CommitEdit(DataGridEditingUnit.Row, true);
public MyViewModel()
{
    Purchases = new ObservableCollection<Purchase>();
    Purchases.CollectionChanged += Purchases_CollectionChanged;
}

private void Purchases_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    if (e.NewItems != null)
        foreach (Purchase item in e.NewItems)
            item.PropertyChanged += Purchase_PropertyChanged;

    if (e.OldItems != null)
        foreach (Purchase item in e.OldItems)
            item.PropertyChanged -= Purchase_PropertyChanged;
}

private void Purchase_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    // save the xml...
}