c# - डाटाग्रिड को अपडेट करने में असमर्थ और डाटाबेस में परिवर्तन सहेजने में असमर्थ




wpf mvvm (2)

मेरे पास एक डाटाग्रिड, एक ऑब्ज़र्वबल कलेक्शन ऑफ आउटपुट मॉडयल्स में एक व्यू मॉडेल और इवेंटटोकॉमम के एक कार्यान्वयन जैसा नीचे दिखाया गया है मैं मात्रा और लागत कॉलम के उत्पाद से कुल कॉलम को अपडेट करना और बुराई कोड के पीछे या Windows फॉर्म डाटाग्रीडविय का उपयोग किए बिना बदलावों को सहेजना चाहता हूं। इसे कैसे प्राप्त किया जा सकता है? डेटा ग्रिड:

<DataGrid x:Name="dataGrid" Margin="5,5,10,5" AutoGenerateColumns="False"  HorizontalAlignment="Stretch" ItemsSource="{Binding ProductList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Stretch" Height="566"  >
<i:Interaction.Triggers>
     <i:EventTrigger EventName="CellEditEnding" SourceObject="{Binding ElementName=Control}">
        <cmd:EventToCommand Command="{Binding EndEdit}" PassEventArgsToCommand="True"/>
     </i:EventTrigger>
</i:Interaction.Triggers>
<DataGrid.Columns>
  <DataGridTextColumn x:Name="Id" Binding="{Binding Path=Id, Mode=TwoWay}" Header="Id"/>
    <DataGridTextColumn x:Name="name" Binding="{Binding Path=Name, Mode=TwoWay}" Header="Name"/>
    <DataGridTextColumn x:Name="cost" Binding="{Binding Path=Cost, Mode=TwoWay}" Header="Cost"/>
    <DataGridTextColumn x:Name="Quantity" Binding="{Binding Path=Quantity, Mode=TwoWay}" Header="Quantity"/>
    <DataGridTextColumn x:Name="total" Binding="{Binding Path=Total, Mode=TwoWay}" Header="Total"/>
</DataGrid.Columns>

फिर देखेंमोडेल में

 private ObservableCollection<Product> _product;
    public ObservableCollection<Product> MyProduct
    {
        get
        {
            return _product;
        }
        set
        {
            Set(ref _product, value);
        }
    }

public ProductViewModel(IDataService proxy)
    {
        _proxy = proxy;

        LoadCommand = new RelayCommand(DoGetProducts);
        EndEdit = new RelayCommand<DataGridCellEditEndingEventArgs>(DoEndEdit);

    }

    private void DoEndEdit(DataGridCellEditEndingEventArgs obj)
    {
        DataGridRow row = obj.Row;
        Product p = (Product)row.Item;
        p.Total = p.Cost*p.Quantity;
        _proxy.SaveAll();
    }

फिर मॉडल में:

public class DataService : IDataService
{
    ProductEntities context;
    public DataService()
    {
        context = new ProductEntities();
    }
    public ObservableCollection<Product> GetProducts(){
        ObservableCollection<Product> products = new ObservableCollection<Product>();
            foreach(var p in context.Products.Tolist()){
                products.add(p);
            }
        return products;
    }
    public void SaveAll()
    {
        context.SaveChanges();
    }
}

डेटाग्रिड उत्पादों को लोड कर रहा है, लेकिन जब कुल लागत और मात्रा में बदलाव किया जाता है तो कुल अपडेट नहीं किया जा रहा है। इसके अलावा, डेटाबेस में परिवर्तनों को नहीं सहेजना


डेटाग्रिड में "कुल" कॉलम के लिए अद्यतन प्राप्त करने के लिए, Product वर्ग को INOTifyPropertyChanged इंटरफ़ेस को लागू करना चाहिए और Total संपत्ति के लिए PropertyChanged ईवेंट बढ़ाया जाना चाहिए:

private double _total;
public double Total
{
    get { return _total; }
    set { _total = value; OnPropertyChanged("Total"); }
}

और डेटाबेस के लिए मूल्य को सहेजने में सक्षम होने के लिए, आपको अपने डेटाबेस तालिका में एक कॉलम के विरुद्ध Total सम्पत्ति को मैप करने की जरूरत है, जैसे आप (उम्मीद है) अन्य कॉलमों के साथ किया था


उत्पादन इस तरह होगा: -

अपना ज़ामल बदलें जैसे कि नीचे देना

<DataGrid x:Name="dataGrid" Margin="5,5,10,5" AutoGenerateColumns="False"  HorizontalAlignment="Stretch" ItemsSource="{Binding ProductList}" VerticalAlignment="Stretch" Height="566"  >
<i:Interaction.Triggers>
     <i:EventTrigger EventName="RowEditEnding" ">
        <cmd:EventToCommand Command="{Binding EndEdit}" PassEventArgsToCommand="True"/>
     </i:EventTrigger>
</i:Interaction.Triggers>
<DataGrid.Columns>
  <DataGridTextColumn x:Name="Id" Binding="{Binding Path=Id, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" Header="Id"/>
    <DataGridTextColumn x:Name="name" Binding="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" Header="Name"/>
    <DataGridTextColumn x:Name="cost" Binding="{Binding Path=Cost, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" Header="Cost"/>
    <DataGridTextColumn x:Name="Quantity" Binding="{Binding Path=Quantity, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" Header="Quantity"/>
    <DataGridTextColumn x:Name="total" Binding="{Binding Path=Total, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" Header="Total"/>
</DataGrid.Columns>

और दृश्य मॉडल में आप बाइंडिंग्स की तरह हो

public BindingList<Product> ProductList
{
 get
  {
   return _proxy.ProductList;
  }
}

और एंडएड कमांड को निम्न फ़ंक्शन निष्पादित करनी चाहिए

private void ExecuteEndEdit(DataGridRowEditEndingEventArgs param)
 {
  var product  = param.Row.Item as Product; 
  var result = ProductList.FirstOrDefault(p => p.Id == product.Id);
  var index= ProductList.IndexOf(result);
  result.Total = result.Cost * result.Quantity;
  ProductList.ResetItem(index);
 }

आपकी IDataService बाध्यकारी सूची को इस तरह से खोल सकता है

  public class DataService : IDataService
    {
        ProductEntities context;
        public DataService()
        {
            context = new ProductEntities();
        }
        public BindingList<Product> ProductList
        {
            get
            {
               //EDIT: YOU HAVE TO CALL context.Products.Load(); OR IT WILL RETURN EMPTY RESULTS
               context.Products.Load();
                return context.Products.Local.ToBindingList<Product>();
            }
        }
        public void SaveAll()
        {
            context.SaveChanges();
        }
    }

संदर्भ। सहेजें आपके कोड को बचाएगा।





mvvm-light