【发布时间】:2020-08-04 09:08:38
【问题描述】:
如何按 StartDate 和 EndDate 对集合进行排序? 在我的仪表板视图中,我有 2 个列表框和 2 个日期选择器。这两个列表都绑定到我的 ViewModel。 我从 Mysql 数据库获得的 ObservableCollection 中的日期。我想要实现的是在 View 中按来自 Pickers 的日期排序和反映排序,一个用于 StartDate,另一个用于 EndDate。 我应该使用临时列表并绑定到它们已经排序的值吗?下面是我的视图,ViewModel。 两种 ObservableCollection 类型都有一个 DateTime 属性。
public class DashboardViewModel
{
public ObservableCollection<AvizModel> lstAvizuri { get; set; } = new ObservableCollection<AvizModel>();
public ObservableCollection<NIRModel> lstNIRuri { get; set; } = new ObservableCollection<NIRModel>();
public DateTime StartDate { get; set; } = DateTime.Now;
public DateTime EndDate { get; set; } = DateTime.Now;
public DashboardViewModel()
{
lstAvizuri = BaseConnection.GetAvizList();
lstNIRuri = BaseConnection.GetNirList();
}
}
查看
<Page.Resources>
<Style x:Key="txtStyle" TargetType="TextBlock">
<Setter Property="FontSize" Value="15"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="TextWrapping" Value="Wrap"/>
</Style>
<Style x:Key="txtStyle1" TargetType="TextBlock">
<Setter Property="FontSize" Value="12"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Top"/>
<Setter Property="TextWrapping" Value="Wrap"/>
<Setter Property="Margin" Value="1"/>
</Style>
</Page.Resources>
<Grid Margin="10,10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid Grid.Row="0" Grid.Column="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="De la data de: " HorizontalAlignment="Center" VerticalAlignment="Center" Padding="15" FontSize="16"/>
<DatePicker Grid.Column="1" x:Name="dpStartDate" VerticalContentAlignment="Center" VerticalAlignment="Center" FontSize="20" SelectedDate="{Binding StartDate, Mode=TwoWay}"/>
</Grid>
<Grid Grid.Row="0" Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="De la data de: " HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="16"/>
<DatePicker x:Name="dpEndDate" Grid.Row="0" Grid.Column="1" FontSize="20" HorizontalContentAlignment="Stretch" VerticalAlignment="Center" VerticalContentAlignment="Center" SelectedDate="{Binding EndDate, Mode=TwoWay}"/>
</Grid>
<StackPanel Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2">
<TextBlock Text="Lista cu NIR-uri create." HorizontalAlignment="Center" Margin="0,5" FontSize="18" FontWeight="Bold"/>
<Grid Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Style="{StaticResource txtStyle}" Margin="5" Text="Serie Factura"/>
<TextBlock Grid.Row="0" Grid.Column="1" Style="{StaticResource txtStyle}" Margin="5" Text="Numar Factura"/>
<TextBlock Grid.Row="0" Grid.Column="2" Style="{StaticResource txtStyle}" Margin="5" Text="Furnizor"/>
<TextBlock Grid.Row="0" Grid.Column="3" Style="{StaticResource txtStyle}" Margin="5" Text="Numar NIR"/>
<TextBlock Grid.Row="0" Grid.Column="4" Style="{StaticResource txtStyle}" Margin="5" Text="TVA Factura"/>
<TextBlock Grid.Row="0" Grid.Column="5" Style="{StaticResource txtStyle}" Margin="5" Text="TVA NIR"/>
<TextBlock Grid.Row="0" Grid.Column="6" Style="{StaticResource txtStyle}" Margin="5" Text="Total Factura"/>
<TextBlock Grid.Row="0" Grid.Column="7" Style="{StaticResource txtStyle}" Margin="5" Text="Data Factura"/>
<TextBlock Grid.Row="0" Grid.Column="8" Style="{StaticResource txtStyle}" Margin="5" Text="Data NIR"/>
<ListBox Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="10" x:Name="lstNir" ItemsSource="{Binding lstNIRuri, UpdateSourceTrigger=PropertyChanged}" HorizontalContentAlignment="Stretch">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Style="{StaticResource txtStyle}" Text="{Binding SerieFactura}"/>
<TextBlock Grid.Column="1" Style="{StaticResource txtStyle}" Text="{Binding NrFactura}"/>
<TextBlock Grid.Column="2" Style="{StaticResource txtStyle}" Text="{Binding FurnizorId}"/>
<TextBlock Grid.Column="3" Style="{StaticResource txtStyle}" Text="{Binding NrNIR}"/>
<TextBlock Grid.Column="4" Style="{StaticResource txtStyle}" Text="{Binding TVAFactura}"/>
<TextBlock Grid.Column="5" Style="{StaticResource txtStyle}" Text="{Binding TVANIR}"/>
<TextBlock Grid.Column="6" Style="{StaticResource txtStyle}" Text="{Binding TotalFactura}"/>
<TextBlock Grid.Column="7" Style="{StaticResource txtStyle}" Text="{Binding DataFactura, StringFormat='{}{0:dd/M/yyyy}'}"/>
<TextBlock Grid.Column="8" Style="{StaticResource txtStyle}" Text="{Binding DataNIR, StringFormat='{}{0:dd/M/yyyy}'}"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</StackPanel>
<StackPanel Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2">
<TextBlock Text="Lista cu Avize create :" HorizontalAlignment="Center" Margin="0,5" FontSize="18" FontWeight="Bold"/>
<Grid Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="1.5*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Style="{StaticResource txtStyle1}" Text="Serie"/>
<TextBlock Grid.Row="0" Grid.Column="1" Style="{StaticResource txtStyle1}" Text="Numar"/>
<TextBlock Grid.Row="0" Grid.Column="2" Style="{StaticResource txtStyle1}" Text="Client"/>
<TextBlock Grid.Row="0" Grid.Column="3" Style="{StaticResource txtStyle1}" Text="Produs"/>
<TextBlock Grid.Row="0" Grid.Column="4" Style="{StaticResource txtStyle1}" Text="Cantitate"/>
<TextBlock Grid.Row="0" Grid.Column="5" Style="{StaticResource txtStyle1}" Text="Nume delegat"/>
<TextBlock Grid.Row="0" Grid.Column="6" Style="{StaticResource txtStyle1}" Text="Nr. Auto"/>
<TextBlock Grid.Row="0" Grid.Column="7" Style="{StaticResource txtStyle1}" Text="Ora Incarcare"/>
<TextBlock Grid.Row="0" Grid.Column="8" Style="{StaticResource txtStyle1}" Text="Reprezentant Furnizor"/>
<TextBlock Grid.Row="0" Grid.Column="9" Style="{StaticResource txtStyle1}" Text="Reprezentant Beneficiar"/>
<TextBlock Grid.Row="0" Grid.Column="10" Style="{StaticResource txtStyle1}" Text="Data"/>
<ListBox x:Name="lstAvizeCreate" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="22" ItemsSource="{Binding lstAvizuri}" HorizontalContentAlignment="Stretch" ScrollViewer.CanContentScroll="True">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="1.5*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Style="{StaticResource txtStyle}" Text="{Binding DateFirma.SerieAviz}"/>
<TextBlock Grid.Column="1" Style="{StaticResource txtStyle}" Text="{Binding DateFirma.NrAviz}"/>
<TextBlock Grid.Column="2" Style="{StaticResource txtStyle}" TextWrapping="Wrap" Text="{Binding DateFurnizor.Nume}"/>
<TextBlock Grid.Column="3" Style="{StaticResource txtStyle}" Text="{Binding DenumireProdus}"/>
<TextBlock Grid.Column="4" Style="{StaticResource txtStyle}" Text="{Binding CantitateLivrata}"/>
<TextBlock Grid.Column="5" Style="{StaticResource txtStyle}" Text="{Binding NumeDelegat}"/>
<TextBlock Grid.Column="6" Style="{StaticResource txtStyle}" Text="{Binding NrAuto}"/>
<TextBlock Grid.Column="7" Style="{StaticResource txtStyle}" Text="{Binding OraIncarcare}"/>
<TextBlock Grid.Column="8" Style="{StaticResource txtStyle}" Text="{Binding RepFurnizor}"/>
<TextBlock Grid.Column="9" Style="{StaticResource txtStyle}" Text="{Binding RepBeneficiar}"/>
<TextBlock Grid.Column="10" Style="{StaticResource txtStyle}" Text="{Binding TimeStamp, StringFormat='{}{0:dd/M/yyyy}'}"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</StackPanel>
<Button x:Name="btnBack" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Content="Inchide" HorizontalAlignment="Center" VerticalAlignment="Center" Padding="60,10" Margin="5" Click="btnBack_Click"/>
View.cs
public DashboardView()
{
InitializeComponent();
DataContext = new DashboardViewModel();
}
视图模型
public class DashboardViewModel
{
public ObservableCollection<AvizModel> lstAvizuri { get; set; } = new ObservableCollection<AvizModel>();
public ObservableCollection<NIRModel> lstNIRuri { get; set; } = new ObservableCollection<NIRModel>();
public DateTime StartDate { get; set; } = DateTime.Now;
public DateTime EndDate { get; set; } = DateTime.Now;
public DashboardViewModel()
{
lstAvizuri = BaseConnection.GetAvizList();
lstNIRuri = BaseConnection.GetNirList();
}
}
模型一。
public class AvizModel
{
public int Id { get; set; }
public DateFirmaModel DateFirma { get; set; }
public FurnizorModel DateFurnizor { get; set; }
public int ProdusId { get; set; }
///Date for Filtering
public DateTime TimeStamp { get; set; }
}
模型二。
public class NIRModel : INotifyPropertyChanged
{
private int furnizorId;
private UInt64 nrNIR;
private string serieFactura;
private string numeFurnizor;
private UInt64 nrFactura;
private double totalFactura;
private double tVAFactura;
private double totalNIR;
private double tVANIR;
private double discount;
private bool discountType;
private bool active;
private bool editing;
private string observatii;
private DateTime data;
private DateTime dataNIR;
[Browsable(false)]
public int Id { get; set; }
[DisplayName("Nr NIR")]
public UInt64 NrNIR
{
get => nrNIR;
set
{
if (Equals(value, nrNIR))
{
return;
}
nrNIR = value;
OnPropertyChanged();
}
}
[DisplayName("Data NIR")]
////Date for filtering
public DateTime DataNIR
{
get => dataNIR;
set
{
if (Equals(value, dataNIR))
{
return;
}
dataNIR = value;
OnPropertyChanged();
}
}
[DisplayName("Total NIR")]
public double TotalNIR
{
get => totalNIR;
set
{
if (Equals(value, totalNIR))
{
return;
}
totalNIR = value;
OnPropertyChanged();
}
}
[DisplayName("TVA NIR")]
public double TVANIR
{
get => tVANIR;
set
{
if (Equals(value, tVANIR))
{
return;
}
tVANIR = value;
OnPropertyChanged();
}
}
[DisplayName("Furnizor")]
public string NumeFurnizor
{
get => numeFurnizor;
set
{
if (Equals(value, numeFurnizor))
{
return;
}
numeFurnizor = value;
OnPropertyChanged();
}
}
[DisplayName("Data Factura")]
public DateTime DataFactura
{
get => data;
set
{
if (Equals(value, data))
{
return;
}
data = value;
OnPropertyChanged();
}
}
[DisplayName("Serie Factura")]
public string SerieFactura
{
get => serieFactura;
set
{
if (Equals(value, serieFactura))
{
return;
}
serieFactura = value;
OnPropertyChanged();
}
}
[DisplayName("Nr Factura")]
public UInt64 NrFactura
{
get => nrFactura;
set
{
if (Equals(value, nrFactura))
{
return;
}
nrFactura = value;
OnPropertyChanged();
}
}
[DisplayName("Total Factura")]
public double TotalFactura
{
get => totalFactura;
set
{
if (Equals(value, totalFactura))
{
return;
}
totalFactura = value;
OnPropertyChanged();
}
}
[DisplayName("TVA Factura")]
public double TVAFactura
{
get => tVAFactura;
set
{
if (Equals(value, tVAFactura))
{
return;
}
tVAFactura = value;
OnPropertyChanged();
}
}
[Browsable(false)]
public int FurnizorId
{
get => furnizorId;
set
{
if (Equals(value, furnizorId))
{
return;
}
furnizorId = value;
OnPropertyChanged();
}
}
[Browsable(false)]
public double Discount
{
get => discount;
set
{
if (Equals(value, discount))
{
return;
}
discount = value;
OnPropertyChanged();
}
}
[Browsable(false)]
public bool DiscountType
{
get => discountType;
set
{
if (Equals(value, discountType))
{
return;
}
discountType = value;
OnPropertyChanged();
}
}
[Browsable(false)]
public bool Editing
{
get => editing;
set
{
if (Equals(value, editing))
{
return;
}
editing = value;
OnPropertyChanged();
}
}
[Browsable(false)]
public bool Active
{
get => active;
set
{
if (Equals(value, active))
{
return;
}
active = value;
OnPropertyChanged();
}
}
public string Observatii
{
get => observatii;
set
{
if (Equals(value, observatii))
{
return;
}
observatii = value;
OnPropertyChanged();
}
}
public List<ProdNIRModel> Produse { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
这是我从数据库中获取数据的方式:
public static ObservableCollection<NIRModel> GetNirList()
{
var result = new ObservableCollection<NIRModel>();
try
{
connection = new MySqlConnection(); connection.ConnectionString = GetConnectionString(); connection.Open();
var query = $"SELECT * FROM NIRuri";
using (var command = new MySqlCommand(query, connection))
{
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
var nirModel = new NIRModel();
nirModel.Id = Convert.ToInt32(reader["Id"]);
nirModel.FurnizorId = Convert.ToInt32(reader["FurnizorId"]);
nirModel.DataFactura = Convert.ToDateTime(reader["DataFactura"]);
nirModel.DataNIR = Convert.ToDateTime(reader["DataNIR"]);
nirModel.SerieFactura = reader["SerieFactura"].ToString();
nirModel.NrFactura = Convert.ToUInt32(reader["NrFactura"]);
nirModel.TotalFactura = Convert.ToDouble(reader["TotalFactura"]);
nirModel.NrNIR = Convert.ToUInt32(reader["NrNIR"]);
nirModel.TVAFactura = Convert.ToDouble(reader["TVAFactura"]);
nirModel.TotalNIR = Convert.ToDouble(reader["TotalNIR"]);
nirModel.TVANIR = Convert.ToDouble(reader["TVANIR"]);
nirModel.Observatii = reader["Observatii"].ToString();
nirModel.Editing = Convert.ToBoolean(reader["Editing"]);
nirModel.Active = Convert.ToBoolean(reader["Active"]);
result.Add(nirModel);
}
}
connection.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
return result;
}
【问题讨论】:
-
您需要排序、过滤还是两者都需要?
-
Model中是否需要StartDate和EndDate值?还是它们只是为了视图?
-
将 ObservableCollection 属性的实现更改为“ReadOnly”:''' public ObservableCollection
lstAvizuri {get; / * 放; * /} = 新的 ObservableCollection ();公共 ObservableCollection lstNIRuri {get; / * 放; * /} = 新的 ObservableCollection (); ''' -
抱歉,我的母语不是英语。我需要在 StartDate 和 EndDate 之间的视图(ListBox)记录中显示,直到它没有被过滤以显示所有记录。我将 DatePicker 选择的日期绑定到 StartDate 第一和第二个到 EndDate 并使用 DateTime 初始化它们。现在不显示从 01/01/0001 开始并且在绑定时不会出错。
-
你说什么语言?我是俄语。
标签: wpf sorting observablecollection