ComboBox仅显示ICollectionView中字段的唯一值

时间:2017-06-22 20:39:34

标签: c# wpf xaml data-binding datagrid

我有一个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 的唯一值?

2 个答案:

答案 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>