我有一个DataGrid,其ItemSource绑定到ICollectionView
(用于过滤)。我尝试使用ComboBox来过滤DataGid中的 EffectiveDate 列,其ItemsSource(下拉值)应该是所有当前可用行的 EffectiveDate ( DataGrid中还有其他过滤器。
以下是代码:
在 MainWindow:
中<DataGrid Name="ProductsList"
ItemsSource="{Binding PricesView}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Sku}" Header="Sku"/>
<DataGridTextColumn Binding="{Binding Upc}" Header="UPC"/>
<DataGridTextColumn Binding="{Binding Cost}" Header="Cost"/>
<DataGridTextColumn Binding="{Binding Map}" Header="MAP"/>
<DataGridTextColumn Binding="{Binding List.EffectiveDate, StringFormat=d}" Header="List Effective Date"/>
<DataGridTextColumn Binding="{Binding List.Vendor.Name}" Header="Vendor"/>
</DataGrid.Columns>
</DataGrid>
<ComboBox ItemsSource="{Binding PricesView}" DisplayMemberPath="List.EffectiveDate"/>
在 MainWIndowViewModel:
中public ICollectionView PricesView { get; set; }
public ObservableCollection<Price> Prices { get; set; } = new ObservableCollection<Price>(DataAccess.GetVendorPricing());
public MainWIndowViewModel()
{
PricesView = CollectionViewSource.GetDefaultView(Prices);
}
价格等级:
public class Price
{
public int Id { get; set; }
public PriceList List { get; set; }
public string Sku { get; set; }
public string Description { get; set; }
public string Upc { get; set; }
public double Cost { get; set; }
public double Map { get; set; }
}
上面的 List
类型为PriceList
:(此处为您找到EffectiveDate
属性的地方)
public class PriceList
{
public int Id { get; set; }
public Vendor Vendor { get; set; }
public string FileName { get; set; }
public DateTime EffectiveDate { get; set; }
}
问题是ComboBox会为每一行(成千上万的!)提供 EffecitveDate ,我需要的只是唯一值。
我尝试this方法,使用IValueConverter
,问题是转换器在没有ICollectionView
的情况下接收整个DisplayMemberPath
并返回整个集合的不同值(这基本上就是一切),我所追求的只是这个特定领域的独特价值。
如何让ComboBox仅显示 EffectiveDate 的唯一值?
答案 0 :(得分:1)
你的记录是不可变的吗? 如果是这样,您可以在ViewModel上发布一个属性,以使用Linq获取不同的分组值:
public IEnumerable<DateTime> DistinctDates
{
get
{
return from item in this.PricesView.Cast<Price>()
group item by item.List.EffectiveDate into g
select g.Key;
}
}
<ComboBox ItemsSource="{Binding DistinctDates}" />
如果可以编辑数据则更加困难,您应该通知&#34; DistinctDate&#34;财产变更或寻找其他方法......
答案 1 :(得分:0)
从读取器加载数据时在sql中使用distinc
using (SqlConnection conn = new SqlConnection("Your Connectionstring"))
{
conn.Open();
SqlCommand cmd = new SqlCommand("Your select Query", conn);
SqlDataReader dr = cmd.ExecuteReader();
IList<string> listName = new List<string>();
while (dr.Read())
{
listName.Add(dr[0].ToString());
}
listName = listName.Distinct().ToList();
ComboBox1.DataSource = listName;
}</string></string>