我目前正在開發我的第一個 WPF 應用程式。我正在使用 .NET Framework 4.8。在我的 WPF 應用程式中,我使用了一個 DataGrid 元素。我像這樣定義我的 DataGrid 元素:
<DataGrid IsReadOnly="True" HeadersVisibility="Column" AutoGenerateColumns="False" Grid.Row="1" Grid.Column="0" x:Name="MyDataGrid" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Background" Value="Turquoise" />
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="BorderThickness" Value="0,0,1,2" />
<Setter Property="BorderBrush" Value="Black" />
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="id" Binding="{Binding id}" Visibility="Hidden" Width="*"/>
<DataGridTextColumn Header="fileId" Binding="{Binding fileId}" Visibility="Hidden" Width="*"/>
<DataGridTextColumn Header="val1" Binding="{Binding val1}" Width="*"/>
<DataGridTextColumn Header="val2" Binding="{Binding val2, StringFormat=\{0:dd.MM.yy\}}" Width="*"/>
<DataGridTextColumn Header="val3" Binding="{Binding val3, StringFormat=\{0:dd.MM.yy\}}" Width="*"/>
</DataGrid.Columns>
</DataGrid>
此外,我還包括了兩個日期選擇器和一個文本框。我將這些定義如下:
<TextBox Grid.Row="0" IsReadOnly="False" Grid.Column="1" Name="FilterVal1" TextChanged="FilterDataGrid"/>
<DatePicker Grid.Row="1" Grid.Column="1" Name="FilterVal2" SelectedDateChanged="FilterDataGrid"/>
<DatePicker Grid.Row="2" Grid.Column="1" Name="FilterVal3" SelectedDateChanged="FilterDataGrid"/>
在我的 FilterDataGrid 方法中,我現在按如下方式過濾 DataGrid 的行:
private void FilterDataGridKampagnen(object sender, object e)
{
using (var ctx = new myEntities())
{
var query = from k in ctx.MyTbl select k;
var lstMyTbl = query.ToList();
if(this.FilterVal1.Text.Trim().Length > 0)
{
lstMyTbl = lstMyTbl.Where(x => x.val1.ToLower().Contains(this.FilterVal1.Text.ToLower())).ToList();
}
if (FilterVal2.SelectedDate != null)
{
lstMyTbl = lstMyTbl.Where(x => x.val2 >= FilterVal2.SelectedDate).ToList();
}
if (FilterVal3.SelectedDate != null)
{
lstMyTbl = lstMyTbl.Where(x => x.val3 <= FilterVal3.SelectedDate).ToList();
}
this.MyDataGrid.ItemsSource = lstMyTbl;
}
}
我現在想知道這是否是為 DataGrid 元素實作過濾器的正確(推薦)方法?特別是在過濾器之間應該存在 AND 關系的參考中,并且在空過濾器的情況下根本不應該考慮它。
uj5u.com熱心網友回復:
感謝mm8。這里可能“推薦”的解決方案是 MVVM 設計模式中的實作。我已經根據 MVVM 設計模式修改了我的代碼。我的 DataGrid 元素看起來像這樣(這里重要的是 ItemSource 到 ListData 的系結。ListData 是根據 MVVM 設計模式在 ViewModel 中的一個串列。):
<DataGrid ItemsSource="{Binding ListData}" IsReadOnly="True" HeadersVisibility="Column" AutoGenerateColumns="False" Grid.Row="1" Grid.Column="0" x:Name="DataGridKampagnen" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Background" Value="Turquoise" />
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="BorderThickness" Value="0,0,1,2" />
<Setter Property="BorderBrush" Value="Black" />
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="id" Binding="{Binding id}" Visibility="Hidden" Width="*"/>
<DataGridTextColumn Header="fileId" Binding="{Binding fileId}" Visibility="Hidden" Width="*"/>
<DataGridTextColumn Header="val1" Binding="{Binding val1}" Width="*"/>
<DataGridTextColumn Header="val2" Binding="{Binding val2, StringFormat=\{0:dd.MM.yy\}}" Width="*"/>
<DataGridTextColumn Header="val3" Binding="{Binding val3, StringFormat=\{0:dd.MM.yy\}}" Width="*"/>
</DataGrid.Columns>
</DataGrid>
我的兩個日期選擇器和我的文本框如下所示:
<TextBox Grid.Row="0" IsReadOnly="False" Grid.Column="1" Name="FilterVal1" Style="{StaticResource FilterInput}" Text="{Binding Val1, UpdateSourceTrigger=PropertyChanged}"/>
<DatePicker Grid.Row="1" Grid.Column="1" Name="FilterVal2" Style="{StaticResource FilterInput}" SelectedDate="{Binding Val2}"/>
<DatePicker Grid.Row="2" Grid.Column="1" Name="FilterVal3" Style="{StaticResource FilterInput}" SelectedDate="{Binding Val3}"/>
我提供系結到 ListData 的資料的方法如下所示:
private List<MyTbl> GetMyTblLst()
{
using (var ctx = new myEntities())
{
var query = from k in ctx.MyTbl select k;
var lstMyTbl = query.ToList();
if(Val1.Trim().Length > 0)
{
lstMyTbl = lstMyTbl.Where(x => x.val1.ToLower().Contains(Val1.ToLower())).ToList();
}
if (Val2 != null)
{
lstMyTbl = lstMyTbl.Where(x => x.val2 >= Val2).ToList();
}
if (Val3 != null)
{
lstMyTbl = lstMyTbl.Where(x => x.val3 <= Val3).ToList();
}
return lstMyTbl;
}
}
ListData 的系結是這樣進行的:
public List<MyTbl> ListData => GetMyTblLst();
這種方法有效并且是解決問題的一種非常干凈且可重用的方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/337959.html
