2017-06-22 129 views
0

我有一个DataGrid,其ItemSource绑定到ICollectionView(用于过滤)。我试图设置一个ComboBox,它将过滤DataGid中的EffectiveDate列,其DataSource中的所有当前可用行(其中还有其他过滤器)的ItemsSource(下拉值)应该是EffectiveDate组合框只显示ICollectionView中唯一的字段值

下面的代码:

主窗口:

<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); 
} 

价格商品类别:

012上述
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; } 
    } 

ListPriceList类型:(这里就是你找到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的唯一值?

回答

1

您的记录是不可变的吗? 如果是这样,你可以发布在视图模型的属性使用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}" />

如果数据可以编辑是比较困难的,你应该通知“DistinctDate “属性更改或寻找另一种方法......在SQL

+0

P '完美!非常感谢! –

0

使用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>