我目前有一個視圖,它應該顯示來自兩個不同物件的資料。為此,我創建了一個視圖模型,其中包含一個物件型別串列,其中包含前面提到的兩個不同物件。這兩個物件是供應商和專案。物品類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.Json.Serialization;
namespace MLaRealERP.Models
{
public class Insumo
{
[JsonPropertyName("Id")]
public int Id { get; set; }
[JsonPropertyName("proveedorId")]
public int ProveedorId { get; set; }
[JsonPropertyName("name")]
public string Name { get; set; }
[JsonPropertyName("tipo")]
public string Tipo { get; set; }
[JsonPropertyName("unidad")]
public string Unidad { get; set; }
[JsonPropertyName("precio")]
public float Precio { get; set; }
}
}
供應商類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.Json.Serialization;
namespace MLaRealERP.Models
{
public class Proveedor
{
[JsonPropertyName("id")]
public int Id { get; set; }
[JsonPropertyName("name")]
public string Name { get; set; }
[JsonPropertyName("celular")]
public string Celular { get; set; }
public void NuevoProveedor(string n, string c)
{
Name = n;
Celular = c;
}
}
}
視圖模型
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MLaRealERP.Models;
namespace MLaRealERP.ViewModels
{
public class InsumosViewModel
{
public class InsumoVM
{
public Insumo insumo { get; set; }
public Proveedor proveedor { get; set; }
}
List<Insumo> repo;
List<Proveedor> proveedores;
public List<InsumoVM> insumos;
//IOrderedEnumerable<Proveedor> proveedores;
public InsumosViewModel()
{
repo = new List<Insumo>();
proveedores = new List<Proveedor>();
insumos = new List<InsumoVM>();
}
public async void InitializeViewModel()
{
repo = await Funciones.GetAll<Insumo>("insumos", App.client);
proveedores = await Funciones.GetAll<Proveedor>("proveedors", App.client);
proveedores = proveedores.OrderBy(p => p.Id).ToList();
//proveedores = repo.OrderBy(repo => repo.Id);
foreach(Insumo insumo in repo)
{
newInsumoVM(insumo);
}
}
private void newInsumoVM(Insumo ins)
{
InsumoVM insumoVM = new InsumoVM();
insumoVM.insumo = ins;
insumoVM.proveedor = proveedores[ins.ProveedorId - 1];
insumos.Add(insumoVM);
}
}
}
資料網格 Xaml
<Window x:Class="MLaRealERP.Views.InsumosView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MLaRealERP.Views"
mc:Ignorable="d"
Title="InsumosView" Height="450" Width="800">
<DockPanel Margin="10">
<Canvas DockPanel.Dock="Top" Margin="0,0,0,20">
<TextBox Canvas.Left="10" Name="txtFilter" TextChanged="txtFilter_TextChanged" Width="171" />
<Button Canvas.Right="10" Name="btnAddInsumo" Click="btnAddInsumo_Click">Agregar Nuevo Producto</Button>
</Canvas>
<DataGrid ItemsSource="{Binding insumos}" Name="dgInsumos" Margin="10" ColumnWidth="*" CanUserAddRows="False" >
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="Background" Value="LightBlue" />
<Setter Property="BorderBrush" Value="Black" />
<Setter Property="BorderThickness" Value="0.5" />
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Id" Binding="{Binding insumos.insumo.Id}" />
<DataGridTextColumn Header="Nombre" Binding="{Binding insumos.insumo.Name}" />
<DataGridTextColumn Header="Tipo" Binding="{Binding insumos.insumo.Tipo}" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</Window>
資料網格 cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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.Shapes;
using MLaRealERP.ViewModels;
namespace MLaRealERP.Views
{
/// <summary>
/// Interaction logic for InsumosView.xaml
/// </summary>
public partial class InsumosView : Window
{
InsumosViewModel insumos;
public InsumosView()
{
InitializeComponent();
insumos = new InsumosViewModel();
insumos.InitializeViewModel();
dgInsumos.DataContext = insumos;
}
//public async void LoadViewItems()
//{
// insumos.InitializeViewModel();
//}
private void txtFilter_TextChanged(object sender, TextChangedEventArgs e)
{
}
private void btnAddInsumo_Click(object sender, RoutedEventArgs e)
{
}
}
}
我想向 Isumos 展示id,name以及tipo與proveedores 一起展示name。
編輯:網格的當前 View.xaml
<Window x:Class="MLaRealERP.Views.InsumosView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MLaRealERP.Views"
mc:Ignorable="d"
Title="InsumosView" Height="450" Width="800">
<DockPanel Margin="10">
<Canvas DockPanel.Dock="Top" Margin="0,0,0,20">
<TextBox Canvas.Left="10" Name="txtFilter" TextChanged="txtFilter_TextChanged" Width="171" />
<Button Canvas.Right="10" Name="btnAddInsumo" Click="btnAddInsumo_Click">Agregar Nuevo Producto</Button>
</Canvas>
<DataGrid ItemsSource="{Binding insumos}" DataContext="{Binding InsumoVM}" Name="dgInsumos" Margin="10" ColumnWidth="*" CanUserAddRows="False" >
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="Background" Value="LightBlue" />
<Setter Property="BorderBrush" Value="Black" />
<Setter Property="BorderThickness" Value="0.5" />
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Id" Binding="{Binding insumo.Id}" />
<DataGridTextColumn Header="Nombre" Binding="{Binding insumo.Name}" />
<DataGridTextColumn Header="Tipo" Binding="{Binding insumo.Tipo}" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</Window>
uj5u.com熱心網友回復:
您的代碼存在一些問題:
- 必需的修復:您只能系結到公共屬性而不是欄位。這意味著
insumos必須是公共財產。此外,系結源(在本例中為 theInsumosViewModel和InsumoVM類)必須實作INotifyPropertyChanged(請參閱 Microsoft Docs 以獲取完整示例) - 即使您不期望屬性更改也是如此。
InsumoVM.cs
public class InsumoVM : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public Insumo Insumo { get; set; }
public Proveedor Proveedor { get; set; }
}
InsumosViewModel.cs
public class InsumosViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public ObservableCollection<InsumoVM> Insumos { get; }
private List<Insumo> Repo { get; set; }
private List<Proveedor> Proveedores { get; set; }
public InsumosViewModel()
{
this.Repo = new List<Insumo>();
this.Proveedores = new List<Proveedor>();
this.Insumos = new ObservableCollection<InsumoVM>();
}
public async Task InitializeViewModel()
{
this.Repo = await Funciones.GetAll<Insumo>("insumos", App.client);
this.Proveedores = (await Funciones.GetAll<Proveedor>("proveedors", App.client)).
OrderBy(p => p.Id)
.ToList();
this.Insumos.Clear();
foreach(Insumo insumo in this.Repo)
{
NewInsumoVM(insumo);
}
}
private void NewInsumoVM(Insumo ins)
{
InsumoVM insumoVM = new InsumoVM()
{
Insumo = ins,
Proveedor = proveedores[ins.ProveedorId - 1]
};
this.Insumos.Add(insumoVM);
}
}
- 必需的修復:您必須使用正確的
Binding.Path。這些專案是 typeInsumoVM。因此InsumoVM是DataContext每列的型別:
<DataGrid ItemsSource="{Binding Insumos}">
<DataGridTextColumn Header="Insumo Name"
Binding="{Binding Insumo.Name}" />
<DataGridTextColumn Header="Proveedor Name"
Binding="{Binding Proveedor.Name}" />
</DataGrid>
- Never return
voidfrom anasyncmethod (except this method is an event handler). Aasyncmethod must returnTaskorTask<T>:
public async Task InitializeViewModel()
{}
Also when using MVVM you should not pass data directly to the view. For example, instead of passing a
List<Cliente>to theClientesView, let theClientesViewbind its controls likedgClientsto a property on theDataContext/view model class.List<Cliente>must be a property of the view model class.To filter data for
ItemsControllike aDataGriduse the collection view. Don't create a new collection that you assign to the ItemsSource for this purpose. It will become difficult to maintain very quick.
dgClientes.Items.Filter = item => (items as Cliente).Apellidos.ToLower().Contains(txtFilter.Text.ToLower());
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/446081.html
上一篇:Typescript---型別“字串”不可分配給型別“從不”
下一篇:如何在資料觸發器中使用默認樣式?
