Silverlight C#:如何根据另一个组合框过滤组合框?

时间:2013-10-22 14:21:23

标签: c# wpf datagrid combobox silverlight-5.0

如何基于另一个组合框过滤组合框? ......再次:)

我正在编写一个网络应用程序来学习。我正在使用Visual Studio 2012,Silverlight 5,C#和SQl Server作为数据源。

我有一个表加载到数据网格和组合框来过滤数据网格。到目前为止,一切正常。

组合框是“FilterState”和“FilterWaterWay”。请注意,它们不在数据网格中。

我想选择一个州并使用州内的那些水道重新填充FilterWaterWay。

我已经看到很多方法可以做到这一点,但它们似乎都不符合我的设置。我可能是错的,只是不知道。

从学习的角度来看,我想知道如何在以下所有3个查询数据示例中实现这一点,但我只会满足于一个。最后一个是我最喜欢的。

感谢您的帮助。


我不介意使用以下内容加载组合框,过滤与否,但我无法确定如何

  1. 将GetQuery仅限于一个字段
  2. 使该字段明确
  3. 这会将GetQuery中的所有数据加载到数据网格。

    LoadOperation<MASTER_DOCKS> loadOp = this._DocksContext.Load(this._DocksContext.GetMASTER_DOCKSQuery());
    
    DocksGrid.ItemsSource = loadOp.Entities;
    

    这会在GetQuery被过滤后将所有数据加载到数据网格

    EntityQuery<MASTER_DOCKS> query = _DocksContext.GetMASTER_DOCKSQuery();
    
    query = query.Where(s => s.WTWY_NAME == WaterwaytoFilterBy && s.STATE == StateToFilterBy);
    
    LoadOperation<MASTER_DOCKS> loadOp = this._DocksContext.Load(query);
    
    DocksGrid.ItemsSource = loadOp.Entities;
    

    这就是我目前加载组合框的方式。这适用于负载,但我不知道如何过滤。 DomainService.cs不知道我想用作此组合框(FilterWaterway)的过滤器的其他组合框(FilterState)。

    如果我可以在xaml中查询ObservableCollection,我可能会让它工作,但它似乎有点粗糙。

    改编自http://www.jonathanwax.com/2010/10/wcf-ria-services-datagrid-filters-no-domaindatasource-2/

    XAML =

    private ObservableCollection<string> waterWayFilterList;
        public ObservableCollection<string> WaterWayFilterList
        {
            get { return waterWayFilterList; }
            set { waterWayFilterList = value; }
        }
    
    
        private void DoPopulateFilter()
          {
                 //Call Invoke Method to get a list of distinct WaterWays
    
           InvokeOperation<IEnumerable<string>> invokeOp = _DocksContext.FillWaterWayList();
               invokeOp.Completed += (s, e) =>
                   {
                        if (invokeOp.HasError)
                        {
                            MessageBox.Show("Failed to Load Category Filter");
                        }
                        else
                        {
                            //Populate Filter DataSource
                            WaterWayFilterList = new ObservableCollection<string>(invokeOp.Value);
    
                            //Add a Default "[Select]" value
                            WaterWayFilterList.Insert(0, "[Select WaterWay]");
    
    
                            FilterWaterWay.ItemsSource = WaterWayFilterList;
                            FilterWaterWay.SelectedItem = "[Select WaterWay]";
                        }
                    };
            }
    

    DomainService.cs =

    [Invoke]
            public List<string> FillWaterWayList()
            {
    
                return (from r in ObjectContext.MASTER_DOCKS
    
                        select r.WTWY_NAME).Distinct().ToList();
    
            }
    

    这是我到目前为止最接近的,似乎很直接。

    它不返回任何错误,但显示的结果显示为System.Collections.Generic.List'1 [System.Char]

    下拉列表中的记录数是正确的,这使我认为它在正确的轨道上。 只有显示的内容是错误的。也许是铸造问题?

    我仍然需要从“TX”所在的FilterState组合框中获取结果。

    var filter = from r in _DocksContext.MASTER_DOCKS
              where r.STATE.Equals("TX")
              select r.WTWY_NAME.Distinct().ToList();
    
    
    MyComboBox.ItemsSource = filter;
    

1 个答案:

答案 0 :(得分:0)

如果没有括号,您正在.Distinct().ToList()上执行string(实现IEnumerable<char>,这就是为什么这些操作有效),这会产生List<char>(这不是你想要的)。您需要添加括号,以便获得独特的水道:

var filter = (from r in _DocksContext.MASTER_DOCKS
          where r.STATE.Equals("TX")
          select r.WTWY_NAME).Distinct().ToList();

请注意,如果两条水道可能具有相同的名称,但实际上是不同的,则您需要选择不同的r,然后以某种方式在下拉列表中区分它们,例如。

var filter = (from r in _DocksContext.MASTER_DOCKS
          where r.STATE.Equals("TX")
          select r).Distinct().ToList();

// generated classes are partial, so you can extend them in a separate file
public partial class MASTER_DOCKS
{
    // the dropdown uses the ToString method to show the object
    public override string ToString()
    {
        return string.Format("{0} ({1})", WTWY_NAME, ID);
    }
}