Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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# 在ICollection中绑定附加元素<;模型>;不破坏EF EDMX_C#_Wpf_Mvvm_Entity Framework 6 - Fatal编程技术网

C# 在ICollection中绑定附加元素<;模型>;不破坏EF EDMX

C# 在ICollection中绑定附加元素<;模型>;不破坏EF EDMX,c#,wpf,mvvm,entity-framework-6,C#,Wpf,Mvvm,Entity Framework 6,我无法使用MVVM方法将数据绑定到DataGrid。也许很傻,但我被卡住了。 我有一个EF6表EFTable,看起来像这样 在我的视图模型中,我有 public ICollection<EFTable> EFTableToBindWithDataGrid { get { return efTable; } set { efTable = value; RaisePro

我无法使用
MVVM
方法将数据绑定到
DataGrid
。也许很傻,但我被卡住了。

我有一个EF6表
EFTable
,看起来像这样


在我的视图模型中,我有

 public ICollection<EFTable> EFTableToBindWithDataGrid
 {
     get
     {
         return efTable;
     }
     set
     {
         efTable = value;

         RaisePropertyChanged("EFTableToBindWithDataGrid");
     }
 }
公共ICollection EFTableToBindWithDataGrid
{
收到
{
返回efTable;
}
设置
{
efTable=数值;
RaisePropertyChanged(“EFTableToBindWithDataGrid”);
}
}

最后,在我看来(xaml),我有了一个DataGrid

<DataGrid   ColumnWidth="*"  AutoGenerateColumns="False" ItemsSource="{ Binding Path=EFTableToBindWithDataGrid,Mode=OneWay}" >    
    <DataGrid.Columns>    
        <DataGridTextColumn Header="Col1" Binding="{Binding Col1}"/>
        <DataGridTextColumn Header="Col2" Binding="{Binding Col2}" />
        <!--................-->
         <!--#####HERE-->
        <DataGridTextColumn Header="ColNotInEFTable" Binding="{Binding ColNotInEFTable}" />

    </DataGrid.Columns>   
</DataGrid>


让我陈述我的问题

  • 我需要绑定计算值
    ColNotInEFTable
    ,但它们不在
    EFTableToBindWithDataGrid
    (因为
    EFTable
    没有
    ColNotInEFTable
    字段)
  • 有没有其他办法来解决这个问题



  • 提前感谢

    从您的
    模型
    创建一个
    视图模型

    public class ViewModelInvoiceProduct : INotifyPropertyChanged
    {
       //only the properties in Model that you want to show in DataGrid
    
       //your additional property
       private int _CGST;
       public int CGST
        {
            get
            {
                return _CGST;
            }
            set
            {
                _CGST = value;
                RaisePropertyChanged("CGST");
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    
    VIEWMODEL:并将
    AddedInvoiceProductsViewModel
    绑定到您的
    DataGrid

    public ICollection<ViewModelInvoiceProduct> AddedInvoiceProductsViewModel {get;set;}
    
    public ICollection<InvoiceProducts> AddedInvoiceProducts
        {
            get
            {
                return invoiceProducts;
            }
            set
            {
                invoiceProducts = value;
                //the idea to populate AddedInvoiceProductsViewModel
                foreach(var invoice in invoiceProducts)
                {
                    var temp = new ViewModelInvoiceProduct();
                    temp.XXX = invoice.XXX;
                    temp.CGST = 1 + 2;
                    AddedInvoiceProductsViewModel.Add(temp);
                }
            }
        }
    
    public ICollection AddedInvoiceProductsViewModel{get;set;}
    公共ICollection附加语音产品
    {
    收到
    {
    退货产品;
    }
    设置
    {
    发票产品=价值;
    //填充AddedInvoiceProductsViewModel的想法
    foreach(发票产品中的var发票)
    {
    var temp=新的ViewModelInvoiceProduct();
    温度XXX=发票XXX;
    温度CGST=1+2;
    AddedInvoiceProductsViewModel.Add(临时);
    }
    }
    }
    
  • 您可以扩展InvoiceProducts类:将其标记为分部类,并将新属性添加到放置在新文件InvoiceProductsExtend.cs中的分部类
  • 您还可以使用新类(包装器或继承器)替换InvoiceProducts并绑定到它
  • 使用绑定转换器从原始属性计算新值

  • 计算值CGST和SGST,但它们不在AddedInvoiceProducts中
    。你不认为这些代码应该是其中的一部分吗?这只是一个例子。好的,太好了。回答您的问题(“是否有其他方法解决此问题?”):是的,我已使用一个通用示例更新了此问题。当我通过
    dataContext.saveChanges()
    method更新数据库时,此方法是否会导致任何问题?EF EDMX文件中未映射新的计算属性(映射)。我认为dataContext.saveChanges()应该可以很好地工作谢谢,我会检查tooInvoiceProducts,其想法是创建一个从模型克隆的列表视图模型
    public ICollection<ViewModelInvoiceProduct> AddedInvoiceProductsViewModel {get;set;}
    
    public ICollection<InvoiceProducts> AddedInvoiceProducts
        {
            get
            {
                return invoiceProducts;
            }
            set
            {
                invoiceProducts = value;
                //the idea to populate AddedInvoiceProductsViewModel
                foreach(var invoice in invoiceProducts)
                {
                    var temp = new ViewModelInvoiceProduct();
                    temp.XXX = invoice.XXX;
                    temp.CGST = 1 + 2;
                    AddedInvoiceProductsViewModel.Add(temp);
                }
            }
        }