Select to view content in your preferred language

Filtering - Collection viewsource

2519
2
11-04-2011 10:33 AM
sairam1
Emerging Contributor
MainPage.Xaml

<UserControl.Resources>
<CollectionViewSource x:Name="cvs" Source="{Binding Attributes[LOG_NUM]}">
</CollectionViewSource>
</UserControl.Resources>
��������������������������
�������������������������

<ListBox ItemsSource="{Binding Source=cvs}" Canvas.Left="10" Canvas.Top="30" Width="80" Height="20"/>
<TextBox x:Name="searchKey" TextChanged="searchKey_TextChanged"
Canvas.Left="30" Canvas.Top="30"
TextWrapping="Wrap" Grid.ColumnSpan="2" />


[U]MainPage.Xaml.cs

public MainPage()
{
InitializeComponent();
this.cvs.Filter += new FilterEventHandler(cvs_Filter);
}


void cvs_Filter(object sender, FilterEventArgs e)
{
e.Accepted=((string)e.Item).ToLower().StartsWith(searchKey.Text.ToLower());
}

private void searchKey_TextChanged(object sender, TextChangedEventArgs e)
{
this.cvs.View.Refresh();
}


Here, I wanted to apply "filter" opertaion to the [LOG_NUM] field values.

Could you please suggest me ...for passing the values of [LOG_NUM] field present in one of the layer, published as service, what statement should i assign to "e.accepted = ?"

e.Accepted=((string)e.Item).ToLower().StartsWith(searchKey.Text.ToLower());


Appreciate for your suggestions!
0 Kudos
2 Replies
JenniferNery
Esri Regular Contributor
How do you get values for your CollectionViewSource? I understand it is bound to only one attribute value but is it from a GraphicCollection?

You may also need to update your Binding statement for ListBox.ItemsSource to since you are pointing to a resource
ItemsSource="{Binding Source={StaticResource cvs}}"


To demonstrate how you can filter using CollectionViewSource, I updated this SDK sample: http://help.arcgis.com/en/webapi/silverlight/samples/start.htm#QueryWithoutMap

XAML-code changes: DataGrid.ItemsSource is set through binding to CollectionViewSource
<Grid.Resources>
            <CollectionViewSource x:Key="MyCollectionViewSource"/>
        </Grid.Resources>

     <slData:DataGrid x:Name="QueryDetailsDataGrid" AutoGenerateColumns="False" HeadersVisibility="Column" Background="White"
                             IsReadOnly="True" Canvas.Left="10" Canvas.Top="50" Height="140" Width="530"
                             HorizontalScrollBarVisibility="Hidden"
                             ItemsSource="{Binding Source={StaticResource MyCollectionViewSource}}"
                             >


Code-behind changes: Query once and update cvs.Source on Button.Click.
        public MainPage()
        {
            InitializeComponent();
            cvs = LayoutRoot.Resources["MyCollectionViewSource"] as CollectionViewSource;

            QueryTask queryTask =
               new QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/5");
            queryTask.ExecuteCompleted += QueryTask_ExecuteCompleted;
            queryTask.Failed += QueryTask_Failed;

            ESRI.ArcGIS.Client.Tasks.Query query = new ESRI.ArcGIS.Client.Tasks.Query();
            query.Where = "1=1";

            query.OutFields.Add("*");
            queryTask.ExecuteAsync(query);
        }
        CollectionViewSource cvs;
        void QueryButton_Click(object sender, RoutedEventArgs e)
        {
            cvs.View.Filter = g =>
                {
                    var graphic = g as Graphic;
                    if ((graphic.Attributes["STATE_NAME"] as string).ToLower().StartsWith(StateNameTextBox.Text.Trim().ToLower()))
                        return true;
                    return false;                   
                };
        }

        void QueryTask_ExecuteCompleted(object sender, ESRI.ArcGIS.Client.Tasks.QueryEventArgs args)
        {
            FeatureSet featureSet = args.FeatureSet;

            if (featureSet != null && featureSet.Features.Count > 0)    
                cvs.Source = featureSet.Features;
            else
                MessageBox.Show("No features returned from query");
        }
0 Kudos
sairam1
Emerging Contributor
Jennifer, Thanks for taking your precious time to work on this.

The field value for which I want to filter is not of graphic layer attribute.

It's a field of a table layer. Right now for this program, I am using the service which is available at arc gis online - http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/TaxParcel/AssessorsBasemap/MapServer/33.

I am still figuring out as how to pass the attribute VALUEINFO to the CollectionViewSource.

I am working on it â?? and this is what I came up with, I am still looking on as how to set the datasource to CollectionViewSource similar to the below program sample:

Google Search
<UserControl.Resources>
<local:DataSource x:Key="dataSource" />
<CollectionViewSource x:Name="cvs" Source="{Binding Names, Source={StaticResource dataSource}}">
</CollectionViewSource>
</UserControl.Resources>



Ourâ??s
<UserControl.Resources>
<CollectionViewSource x:Name="cvs" x:Key="MyCollectionViewSource" Source="{Binding Attributes[VALUEINFO], Source={StaticResource �������..}}"/> </UserControl.Resources>



Please provide me if you have any inputs on this, as how to move forward with the requirement that I have.

Thanks for your time!

















How do you get values for your CollectionViewSource? I understand it is bound to only one attribute value but is it from a GraphicCollection? 

You may also need to update your Binding statement for ListBox.ItemsSource to since you are pointing to a resource 
ItemsSource="{Binding Source={StaticResource cvs}}"


To demonstrate how you can filter using CollectionViewSource, I updated this SDK sample:   http://help.arcgis.com/en/webapi/silverlight/samples/start.htm#QueryWithoutMap

XAML-code changes: DataGrid.ItemsSource is set through binding to CollectionViewSource 
<Grid.Resources>
            <CollectionViewSource x:Key="MyCollectionViewSource"/>
        </Grid.Resources>

     <slData:DataGrid x:Name="QueryDetailsDataGrid" AutoGenerateColumns="False" HeadersVisibility="Column" Background="White"
                             IsReadOnly="True" Canvas.Left="10" Canvas.Top="50" Height="140" Width="530"
                             HorizontalScrollBarVisibility="Hidden"
                             ItemsSource="{Binding Source={StaticResource MyCollectionViewSource}}"
                             >


Code-behind changes: Query once and update cvs.Source on Button.Click. 
        public MainPage()
        {
            InitializeComponent();
            cvs = LayoutRoot.Resources["MyCollectionViewSource"] as CollectionViewSource;

            QueryTask queryTask =
               new QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/5");
            queryTask.ExecuteCompleted += QueryTask_ExecuteCompleted;
            queryTask.Failed += QueryTask_Failed;

            ESRI.ArcGIS.Client.Tasks.Query query = new ESRI.ArcGIS.Client.Tasks.Query();
            query.Where = "1=1";

            query.OutFields.Add("*");
            queryTask.ExecuteAsync(query);
        }
        CollectionViewSource cvs;
        void QueryButton_Click(object sender, RoutedEventArgs e)
        {
            cvs.View.Filter = g =>
                {
                    var graphic = g as Graphic;
                    if ((graphic.Attributes["STATE_NAME"] as string).ToLower().StartsWith(StateNameTextBox.Text.Trim().ToLower()))
                        return true;
                    return false;                   
                };
        }

        void QueryTask_ExecuteCompleted(object sender, ESRI.ArcGIS.Client.Tasks.QueryEventArgs args)
        {
            FeatureSet featureSet = args.FeatureSet;

            if (featureSet != null && featureSet.Features.Count > 0)    
                cvs.Source = featureSet.Features;
            else
                MessageBox.Show("No features returned from query");
        }
0 Kudos