-
Amid the multiple flavors of zip/compression components offered by Xceed, it can be confusing to some as to which one is the right one for a project.
A simple way to eliminate a couple of options is to start with the targeted platform.

*via a .NET wrapper automatically generated by Visual Studio. Application must target x86.
Already the list is narrowed down to 1-3 products per development framework, which should make the decision much easier. For example, only Xceed Real-Time Zip for Silverlight can be used in Silverlight; therefore, if you are creating a Silverlight project that requires zip compression, Xceed Real-Time Zip for Silverlight is the product you wanted to be looking at.
At this point, since we have already narrowed down which product can be used with which development framework, we can narrow the list down even further by determining what features the product must have.

1- When reading sequentially until item is reached. 2- Slow 3- PPMd not supported
Although the above table provides a detailed view of the major features, it is far from being complete. The extensive list of features for each product can be found in each product’s respective documentation, or online at the following locations:
Xceed Real-Time Zip for .NET Xceed Zip for .NET Xceed Zip for .NET w/SFX Module Xceed Real-Time Zip for .NET Compact Framework Xceed Zip for .NET Compact Framework Xceed Real-Time Zip for Silverlight Xceed Streaming Compression Library Xceed Zip Compression Library Xceed Zip for x64
|
-
If you never use Blend, then this post will be of no interest to you other than to laugh at my misery; however, if you are a designer who wants to style or template the various elements in Xceed DataGrid for Silverlight, then this is the post for you.
Since the initial release of Xceed DataGrid for Silverlight, we received many questions in regards to styling and retemplating various grid elements in Blend. Unfortunately, the answer until now was "Yes, it can be done. Good luck." Since this answer was understandably unsatisfactory, Matt (@MattD1980) and I decided that it was time to make some tutorials that demonstrate how. Ok, that's not exactly what happened, but that's my story and I'm sticking to it! Now, although these guides will be added to the documentation, we thought it might be a good idea to get the first example out there to help out the designers who need to get the show on the road. So what better elements to start with than the column-manager cells (AKA column headers).
I will start with a semi-empty project that already contains an XML data source. You can refer to the Expression Blend topic in the documentation for instructions on how it was created. A license key was also provided in the public App constructor in order to be able to use Xceed DataGrid for Silverlight (see Licensing topic for more information) .
In order to provide a new style for the column-manager cells, we need to add a column-manager cell to our scene. To do so, type "ColumnManagerCell" in the Asset Library and, once found, drag it to the scene's design surface. Notice that a standalone column-manager cell was added to the XAML. We will be removing it later.


The next step is create a copy of the template, which can be done by right-clicking on the column-manager cell and selecting the "Edit Template->Edit a Copy..." option in the context menu.

Provide your style resource with a key, indicate where you want it defined, then press OK. For this example, I will name my style "UnderlinedColumnManagerCellStyle"

Because we are creating a copy of the template, Blend is kind enough to include everything that is required by the template. To see the newly created style, which is currently identical to the original, scroll down to the bottom.

So let's modify the style to add an "underline" to the column-manager cell on mouse over. To do so, select the column-manager cell in the scene, and the select its top-most parent grid (1) in the Objects and Timeline window. Double click on the Rectangle (2) to add it at the parent-grid level in the visual tree, making sure that is it the last item in the tree since we want it to overlap the other elements (3).

Making sure the Rectangle is selected and correctly positioned at the bottom of the column-manager cell, in the property grid, align it to the bottom by setting its VerticalAlignment property to Bottom, the HorizontalAlignment property to Stretch, give it a height of 4 pixels, a stroke thickness of 0, and change its opacity to 0 since we only want it to be visible when the MouseOver state kicks in. Also make sure to set its background to a nice shade of pink for maximum results. It is also recommended to name your Rectangle. I suggest something snazzy like underlineRectangle.
To recap:
- Position the Rectangle at the bottom of the column-manager cell
- Make it pink
- Set its VerticalAlignment property to Bottom
- Set its HorizontalAlignment property to Stretch
- Set its Height property to 4, or to any other value if you are feeling wild
- Set its StrokeThickness property to 0
- Set its Opacity property to 0
- Give it a snazzy name

To add the MouseOver state, select the States tab and click on MouseOver in the CommonStates section, which should now put Blend in "recording mode". While in recording mode, select the Rectangle and change its opacity back to 100.
Do not forget to move the focus to another editor in the property grid or you will spend the afternoon trying to figure out why the state is not working! Take my word for it, that was not a pleasant afternoon and involved many expletives.
Once you are done, stop the recording by clicking on the red button. Congratulations! You have successfully added a new visual state!

Obviously at this point you are anxious to try out your new style, but there is still a little bit of work that needs to be done. First, you need to add a datagrid control to the UserControl. To do so, begin by returning the scope to the UserControl and select it in the hierarchy.

In the Asset library, search for "DataGridControl" and, once found, add it to the UserControl.

The last steps are to delete the stand-alone column-manager cell that was added to the XAML, and remove the style key (x:Key="UnderlinedColumnManagerCellStyle") from the column-manager cell's style so that it can be applied implicitly to every column-manager cell in the grid.
I lied, there is one last step, which is to bind the datagrid control to a data source. You can refer to the Expression Blend topic in the documentation for instructions on how it was created and how to bind the datagrid to it.
Hit F5 and voilà! You now have a fancy new style for your column-manager cells!

Good luck!
|
-
Sticky columns is an innovative new feature that was added to version 1.1 of Xceed DataGrid for Silverlight. It’s also one of the features that encountered the most resistance from the development team simply because we did not know how it could be used or if it would be used at all. But after various prototypes, we all came to the conclusion that, yes, sticky columns had a reason for being and could benefit most applications, if used properly. Now that you are both intrigued and worried, let's get started!
A "sticky" column will always remain in the viewport. When scrolling, once a column that has been marked as sticky reaches the left or right edge of the viewport, it will "stick" to it and the other columns will continue to scroll out of view. If additional columns are marked as sticky, they will stick to the left or right of any columns that are already stuck to the edge of the viewport. A column that has been "stuck" will preserve its position, meaning that when the column to its immediate left or right is brought back into view, it will regain its position and scroll along with the other columns. Take a look.
In the video, the sticky columns are those that have a pushpin in their column header. When they are stuck, they take on a blue highlight to indicate their state.
Notice that the first column in the viewport also has a blue highlight and a pushpin, but does not scroll. This column, in addition to being sticky, is also fixed. Why? Because it is the first column in the grid and has been marked as sticky; a similar effect would occur if it had been the last column. So simply positioning a column in the correct position and marking it as sticky will result in the columns being fixed. You want more than one fixed column? Any columns also marked as sticky whose visible positions are next to the first or last fixed columns will also be considered fixed.
So how does it all work? Very simply :)
Every column has an IsSticky property, which can be programmatically set to true to mark the column as sticky. When this happens, a pushpin will be displayed in the column’s header to provide a visual representation of the column’s stickability. The ability to mark a column as sticky is also be made available to the end user by setting a column's AllowSticky property to true (default). If set to false, the end user will not be able to change column stickiness. End-user interaction with stick columns can be disabled for all columns by setting the AllowStickyColumns property, which is defined on the column-manager row (see ColumnManagerRow class), to false. So if you wanted to only allow a few columns to become sticky, you would set the AllowStickyColumns property to false on the column-manager row and the AllowSticky properties of the desired columns to true. For example:
<sldg:DataGridControl x:Name="netflixGrid" ItemsSource="{Binding Path=NetflixTitles}" ReadOnly="True"> <sldg:DataGridControl.Resources> <Style TargetType="{sldg:ColumnManagerRow}"> <Setter Property="AllowStickyColumns" Value="False"/> </Style> </sldg:DataGridControl.Resources>
<sldg:DataGridControl.Columns> <sldg:Column FieldName="BoxArt" Title="" Width="100" AllowSticky="True"/> <sldg:Column FieldName="ShortName" Title="Title" Width="200" AllowSticky="True" IsSticky="True" /> </sldg:DataGridControl.Columns> </sldg:DataGridControl>
The visibility of the pushpin that indicates that a column is sticky can be modified through the StickyColumnToggleButtonVisibility property, which is defined at both the column and the column-manager row levels. By default, it is set to Auto, meaning that it will only be displayed when a column is stuck or when the mouse is over the column header. It can also be set to Always or Never to keep it permanently displayed or hidden, respectively.
|
-
It's that time of year again where those of us in the northern hemisphere are starting to huddle down for the 6 months of winter ahead. So what better time than now to let you in on the new features being introduced in Xceed DataGrid for Silverlight v1.1?
First on the list is group headers and footers. Version 1.1 of Xceed DataGrid for Silverlight adds headers and footers to group configurations. Any item can be added as a DataTemplate to the headers and footers, which will then be applied to the appropriate groups.

An innovative feature that is introduced in version 1.1 is "sticky" columns, which takes the basic concept of "fixed" columns and brings it to the next level! By marking a column as "sticky," it will always remain in the viewport: once the column reaches the left or right edge of the viewport, it will "stick" to it and the other columns will continue to scroll out of view, making sure that your most important data is always in view. If other columns are marked as sticky, the will stick to the left or right of any columns that are already "stuck." A "stuck" column will preserve its visible position, meaning that when the column to its immediate left or right is brought back into view, it will regain its position and scroll along with the other columns. Take a look:
"But what about fixed columns," you ask? Easy! Columns are considered fixed when they are marked as sticky and they are the first or last columns in a grid. So by simply positioning the columns in the correct position and marking them as sticky will result in these columns being fixed. You want more than one fixed column? Any columns also marked as sticky whose visible positions are next to the first or last fixed columns will also be considered fixed.
Also added to the upcoming version are the Dark and Light Metro themes, which are inspired by Microsoft's Metro design philosophy, as seen in Windows Phone 7. These themes provide a bold new look with a configurable accent color.


Xceed DataGrid for Silverlight v1.1 also provides synchronous and asynchronous XML spreadsheet format (xmlss) exporting capabilities with the resulting documents supported by Excel 2002 and up, as well as by the Microsoft Office Web Components Spreadsheet Component. Data can also be exported to the comma-separate value (CSV) format, which is compatible with a wide variety of applications. So whether you decide to export all the items in a grid, the currently selected items, or a customized selection, from a local or remote data source, with v1.1, you can!
Stay tuned for more posts that will delve into the nitty-gritty details of these features.
|
-
In my first post in this series, Binding to a Data Source, I explained how to connect Xceed DataGrid for Silverlight to an OData data source. This post will explain how to configure the datagrid to get the most out of it and your data.
As I said in the first post, loading data from a data source is quite easy; however, the initial result is probably not what most people would like since the data is displayed in its "raw" form. For example, if we take the data returned by the Netflix catalog, you would probably want to limit the number of decimals places for double-typed columns and display an actual image rather than its URL. You may also want to limit the number of columns that are displayed to only those that contain the pertinent information. And so on.

So, first things first, let's reduce the number of columns that are displayed to only those that contain the information we want. There are 2 ways that this can be accomplished: the first being to set the Visible property to false for the columns that are not to be displayed, the second is to set the grid's AutoCreateColumns property to false and manually define the desired columns. The first option would be acceptable if only a couple of columns from a large list are to be hidden; however, the second option is preferrable if more columns are to be hidden than displayed. This is the option that we will use in this sample since we only want to display 6 of the columns.
<sldg:DataGridControl x:Name="netflixGrid" ItemsSource="{Binding Path=NetflixTitles}" AutoCreateColumns="False">
<!-- Because the AutoCreateColumns property was set to false, it is necessary to define the columns that will be displayed in the grid. If a custom content template is to be used, it is defined through a column's CellContentTemplate property. --> <sldg:DataGridControl.Columns> <sldg:Column FieldName="BoxArt" Title="" Width="100"/> <sldg:Column FieldName="ShortName" Title="Title" Width="200"/> <sldg:Column FieldName="Synopsis" Width="600"/> <sldg:Column FieldName="ReleaseYear" Title="Released" Width="75"/> <sldg:Column FieldName="Rating" Width="75"/> <sldg:Column FieldName="AverageRating" Title="Average Rating" Width="100"/> </sldg:DataGridControl.Columns> </sldg:DataGridControl>
Now that we have limited the number of columns to only those we want, the next step is to decide how the content in those columns is displayed. In the columns that we decided to keep, there are 3 that could use a facelift. These are the BoxArt column, in which we could display an image rather than a URL; the Synopsis column, in which we could format the text to support the various HTML tags such has bold, italic, and hyperlinks (i.e., href); and the AverageRating column, in which we could display a "star-rating" rather than simply displaying a numeric value.
Up first, the BoxArt column. But before we start, let's make a grocery list of what we will need.
In order to change how the content of each cell in a column is displayed, you need to provide a DataTemplate to the column's CellContentTemplate property. Easy enough. So what will we need to change a URL into an actual image? For starters, we will need to create a new DataTemplate that uses an Image and whose Source property is bound to the LargeUrl field, which provides the URL. In some cases a title will not have a URL. When this happens, we want to display an image that indicates that no image is available for the title. In order to do this, we will create an IValueConverter that will return the "no image" image when one is not provided for the title, and use this converter in the binding that is applied to the Source property.
<!-- The BoxArtImageSourceConverter is an IValueConverter that is used to display a custom image when one is not provided by the Netflix data. --> <local:BoxArtImageSourceConverter x:Key="boxArtImageSourceConverter" />
<!-- The DataTemplate that will be used to display the box art. --> <DataTemplate x:Key="boxArtCellContentTemplate"> <Image Source="{Binding Path=LargeUrl, Converter={StaticResource boxArtImageSourceConverter}}" Height="100" VerticalAlignment="Center" HorizontalAlignment="Center"/> </DataTemplate>
The next DataTemplate we will create is one that will be used by the AverageRating column to display a star-rating rather than a value. Like the BoxArt column, we will need to create an IValueConverter that will take the value and return a star-rating instead. To keep things clean, the various data templates that can be returned by the RatingConverter are defined in the ImageResourceDictionary.xaml resource dictionary.
<!-- The RatingConverter is an IValueConverter that is used to convert a value into an image. In this case, it will display a numeric value as a star-rating system.
The DataTemplates that are used are retrieved from the ImageResourceDictionary.xaml resource dictionary, which is included as a merged dictionary in the resources of the UserControl. --> <local:RatingConverter x:Key="ratingConverter" FullTemplate="{StaticResource fullStarDataTemplate}" HalfTemplate="{StaticResource halfStarDataTemplate}" EmptyTemplate="{StaticResource noStarDataTemplate}"/>
<!-- The DataTemplate that will be used to display the star ratings. --> <DataTemplate x:Key="ratingCellContentTemplate"> <ItemsControl ItemsSource="{Binding Converter={StaticResource ratingConverter}}" VerticalAlignment="Center" HorizontalAlignment="Center" ToolTipService.ToolTip="{Binding StringFormat=\{0:f1\}}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal" /> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> </ItemsControl> </DataTemplate>
The last DataTemplate will be used by the Synopsis column to properly format the text that it displays according to the various HTML tags found throughout the text. This template required a little more work since some things that were required (*cough* FlowDocument *cough*) are missing from the Silverlight framework and needed to be created. Like the other 2 columns, an IValueConverter was also needed, except this one converts plain text to a Paragraph that contains the appropriate text and inlines (e.g., Hyperlink).
<!-- The TextToParaConverter is an IValueConverter that is used to create a paragraph from plain text. It will also replace tags such as bold, italic, and href into the appropriate inline type (e.g., HyperLink)--> <local:TextToParaConverter x:Key="textToParaConverter"/>
<!-- The DataTemplate that will be used to display the synopsis. The background has been set to Transparent to allow the default row highlighting to be apparent. --> <DataTemplate x:Key="textWrappingContentTemplate"> <local:BindableRichTextBox BindableBlocks="{Binding Converter={StaticResource textToParaConverter}}" BorderThickness="0" Background="Transparent"/> </DataTemplate>
Now that we have all these nifty data templates, simply assign them to CellContentTemplate property of the appropriate columns, and voilà! All data is now displayed in a more user-friendly and appropriate manner. Sprinkle a little sorting and grouping, and you are ready to go!
<sldg:Column FieldName="BoxArt" Title="" Width="100" CellContentTemplate="{StaticResource boxArtCellContentTemplate}"/>
<sldg:Column FieldName="Synopsis" Width="600" CellContentTemplate="{StaticResource textWrappingContentTemplate}"/>
<sldg:Column FieldName="AverageRating" Title="Average Rating" Width="100" CellContentTemplate="{StaticResource ratingCellContentTemplate}"/>
If you would like to download the sample to play around with it and have access to the custom classes that were created for it, you can do so HERE!
|
-
A while back Odi (@kosmatos) tweeted about how easy it was to bind Xceed DataGrid for Silverlight to an OData data source, and he was right. It is easy! So easy in fact that it wouldn't make for much of a blog post. So what I decided to do is show you how to connect to an OData data source as well as demonstrate how to set up the grid to get the most out of it and your data. Of course, you can swap an OData source for another one of your liking.
Obviously, the first step is to connect to an OData data source to get some data. To do so, add a service reference to your Silverlight application, provide an address to an OData source, such as the Netflix catalog, and give it a more appropriate namespace name.

Now that the service reference is added to the project, let's add a property to the MainPage that will expose the DataServiceQuery that contains the Netflix titles, including the total count of all entities in the entity set. This is the property that the grid will bind to to get its data. Note that I have also set the DataContext of the page to itself to make my life easier.
private NetflixCatalog m_catalog = null; public DataServiceQuery<Title> NetflixTitles { get { if( m_catalog == null ) m_catalog = new NetflixCatalog( new Uri( "http://odata.netflix.com/Catalog", UriKind.Absolute ) ); return m_catalog.Titles.IncludeTotalCount(); } }
So let's get to down to the nitty-gritty and add the datagrid to the page so that we can bind it to the Netflix data. Like most item-containing controls, the grid has an ItemsSource property through which we will bind to the NetflixTitles property. Because I set the data context of the main page to itself and the data context of the grid is the page, a simple "path binding" can be used. Something like this:
<sldg:DataGridControl x:Name="netflixGrid" ItemsSource="{Binding Path=NetflixTitles}"/>
And that's it! In theory, there is nothing else that needs to be done. All the data will be loaded in the grid and can be grouped, sorted, filtered, and edited, but it won't be as pretty as it could be.
So yeah, only a couple lines of code and XAML to get the grid to load data from an OData source, but there is more to displaying data than simply having it on the screen. You will most likely want your data to be displayed in an attractive and easy-to-understand manner for your end users. Not a problem! But I'll show you in my next post :)
If you can't wait for the next post, you can always download the full sample and try it out for yourself.
Stay tuned!
|
-
So after a year and a half of development, Xceed DataGrid for Silverlight was officially released this week! Unlike Xceed DataGrid for WPF, where we were first to market, we are a little late coming into the Silverlight datagrid game; however, it will have been well worth your wait. We did not just want to make another Silverlight grid. We wanted to make the BEST Silverlight grid. So why is it so awesome? Simple. From the first line of code that was written, user experience and data virtualization were our top priorities. So how does it work? I'm glad you asked!
The data-virtualization engine behind Xceed DataGrid for Silverlight is the invisible maestro that orchestrates all the behind-the-scenes data management. Although it is the cornerstone on which Xceed DataGrid for Silverlight was built, in most cases, you will never have to deal with it and will only know that it is working because everything is working so well. To get a little bit more technical, the data-virtualization engine is basically a layer of enumerators that each manipulate and process the data items that are displayed in the grid, all the while making sure that "extra" items are available, just in case.
Take a look at the image below and consider a simple operation, such as a line down (i.e., "Get(1)"):

When the grid requires new items (1), the request is processed by the data-virtualization engine, which begins its initial pass by querying the caching enumerator to see if it has the data items that are needed (2). If the caching enumerator has the items, they are immediately returned and displayed in the grid (10). If the caching enumerator does not contain the required items, the request is sent to the async enumerator, which will create and immediately return "dummy" items (3) so that the grid remains responsive even though there is a pending request to retrieve new items. The request will then be queued along with any additional pending requests. The async enumerator is also responsible for optimizing the query that is sent to the subsequent enumerators. For example, if three line down operations are queued, the async enumerator will condense these pending operations into a single "Get(3)" query, thereby only sending one request to the next enumerator rather than three (4). Obviously, if there is only one pending request within a reasonable lapse of time, it will be sent as-is to the next enumerator.
Once the async enumerator has optimized the pending queries, the resulting query is sent to the grouping enumerator, which takes care of appending any grouping criteria (i.e., "OrderBy") to the query that is being sent to the data source (5). Once the grouping enumerator has added its requirements, the query is passed to the filtering enumerator, which may also append its filtering criteria if it is using a filter expression (6). If a predicate is being used to filter the items, the information will not be appended to the query and the unmodified query will be sent to the buffering enumerator, which is next in line. The buffering enumerator, which typically contains multiple pages of data that has been fetched from the data source, is the last layer before the query is handed over to the data-source provider. Now, the buffering enumerator has an additional role, which is it make sure that it makes a worthwhile roundtrip to the server. If it realizes that the trip is "not worth it," as in this example of only retrieving three items, it will decide to get more items and keep them in its buffer (7). Once the query exits the data-virtualization engine, the data-source provider takes over and queries the data source using the transformed query (8).
All this time, the grid has remained fully responsive.
Once the data-source provider receives the items from the data source, they are handed to the buffering enumerator, which passes the items that were requested to the filtering enumerator and buffers the rest for later use. At this point, if a predicate is being used to filter the items, it is possible that the filtering enumerator rejects the items that are received and requests more from the buffering enumerator, which luckily grabbed more than was requested. If only a filter expression was used, then the items are passed directly from the filtering to the grouping enumerator. Like the filtering enumerator, it is possible that the grouping enumerator rejects the items. For example, if the items belong to a collapsed group, they will be rejected and new items will be requested (9). Of course, the grouping enumerator will modify the request to make sure that further requests will "jump" over collapsed groups.
After the items have successfully passed the lower enumerators, they are finally transferred to the async enumerator that will replace the dummy items with the actual items, which will then be displayed in the grid (10).
In addition to the enumeration layers, Xceed DataGrid for Silverlight also actively pre-fetches new items and rebalances the caching and buffering enumerators while the data-virtualization engine is idle. What this means is that when there are no pending requests in the async enumerator, the engine will actively retrieve new items and make sure that the currently displayed items are moved to the middle of the buffers. In other words, if the currently displayed items are located at the end of the buffer, they will be moved to the middle, the extra items at the top will be cleared, and new items will be fetched to complete the buffer.
So there you have it: a glimpse of the inner workings of Xceed DataGrid for Silverlight!
*Title created by and stolen from Mike Strobel ( @mstrobel)
|
-
One of the first things you will notice when you`ll start using Xceed DataGrid for Silverlight is the fact that there is no SelectedItem(s) property. That's right. No SelectedItems property. The upcoming datagrid for Silverlight is a very different beast than today's current datagrids. It is built from the ground up to load and navigate through remote data sources extremely efficiently. It aims to make those remote data sources feel like they are completely loaded locally in your datagrid, without actually doing so. To achieve this, it takes data virtualization a few steps further than any other datagrid ever has. I talked about some of these advances in my post that introduces Xceed DataGrid for Silverlight. One of them is that everything this datagrid does happens asynchronously. This makes for a highly responsive user experience, but there are a few things developers will have to do differently in order to reap the benefits. Although it may seem absurd, the decision to not have a SelectedItems property was not taken lightly, and many long discussions were had with proponents on both sides of the debate. So why is it not there? Simple. Because 95% of the time, it wouldn't work. Yes, 95% is an arbitrary number but it is a fair representation. The only way to keep your application responsive, even when the network isn't, is to use asynchronous data virtualization, which means to read and write data in the background. Having a synchronous SelectedItems property in this situation made no sense since the UI would have to wait for the selected items to be returned from the server. So we decided to go with a fully virtualized approach and created a selection model in which "selection ranges" are created. These ranges abstract the need to store the exact list of selected items and provide instantaneous selection across any number of items. If this process were done locally, the selection range would need to be processed as soon as it is created. For example, let's say you have a large source with and the user selects a few items currently on screen. In this case, the SelectedItems property would return immediately since the items are already loaded. The UI wouldn't lock-up. But if the user selects a group of items and many of them aren't on screen, those would have to be immediately fetched from the data source before SelectedItems could return its value. The UI would freeze for an unpredictable amount of time while those items are returned, making your application feel sluggish. This is why we exposed the BeginGetSelectedItems and EndGetSelectedItems asynchronous methods rather than a SelectedItem(s) property: we wanted you to be aware that requesting the selected items can be a costly operation and that in most cases, we could not guarantee if and when you would get the result. "But I absolutely MUST have a SelectedItems property!" Ok! public IEnumerable<object> SelectedItems { get { return ( IEnumerable<object> )GetValue( SelectedItemsProperty ); } set { SetValue( SelectedItemsProperty, value ); } }
// Using a DependencyProperty as the backing store for SelectedItems. // This enables animation, styling, binding, etc... public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.Register( "SelectedItems", typeof( IEnumerable<object> ), typeof( MainPage ), null );
private void GetSelectedItems() { IAsyncResult result = this.sldgDataGridControl.BeginGetSelectedItems( new AsyncCallback( this.ProcessSelectedItems ), null );
if( result.IsCompleted ) this.SelectedItems = this.sldgDataGridControl.EndGetSelectedItems( result ); }
private void ProcessSelectedItems( IAsyncResult result ) { if( result.CompletedSynchronously ) return;
this.SelectedItems = this.sldgDataGridControl.EndGetSelectedItems( result ); }
private void DataGridControl_SelectionChanged( object sender, EventArgs e ) { this.GetSelectedItems(); }
|
-
The Silverlight development team has been hard at work creating our Silverlight datagrid, and I thought that I would let you in on our progress and give you a glimpse as to what you can expect when it's released. Last year at PDC 2009, we demoed what was an early-stage version of the grid. Since then, it has come a long way and is nearing feature completion.

Xceed DataGrid for Silverlight takes user experience to a whole other level. Perfectly smooth horizontal and vertical scrolling, fully animated column reordering and resizing, customizable animations for group expansion and collapse, as well as transition animations for when rows are added or removed, provides an unprecedented level of UI slickness and responsiveness.
Asynchronous data virtualization. THE must-have in a Silverlight data grid, it’s the cornerstone on which Xceed DataGrid for Silverlight is built. We’ve packed a lot into our implementation of this, such as major advancements in how virtualized data is handled, automatic discovery, active pre-fetching and caching of data, quick navigation, and instant grouping. You can add to that built-in support for WCF Data Services and WCF RIA Services, as well as "event-driven" and "full-list" data sources (i.e., pass-through data virtualization) and many more to come, which means that where you get your data from no longer matters. Just connect to the source, and we handle the rest. Simple. Trust me: you haven't seen anything like this in any other grid before.
Sometimes, appearances are everything. Don't like the yellow/orange/i-am-sorry-Catherine-i-do-not-know-the-exact-color border in the PDC-demo theme? Change it! Xceed DataGrid for Silverlight is 100% "blendable" and its elements can be customized to match the look and feel of any application. Or if you prefer, you can use one of the built-in themes that were designed for the grid with user experience in mind.
Now, I know the first question our current WPF clients will have is this: "I have a project that currently uses Xceed DataGrid for WPF. Can I just switch it out for the Silverlight version?" The answer to that is no, you can't. Why? Well there are a couple of reasons. First, Silverlight is not WPF; there are things you can do in WPF that you can't do in Silverlight. Doing a direct API port would have been 1) nearly impossible and 2) would not have allowed us to take full advantage of the Silverlight platform. Second, since the initial release of Xceed DataGrid for WPF, we have developed new, innovative ways of handling data, but it would be impossible to implement them in that product without doing major breaking changes. With our upcoming Silverlight datagrid, we have been able to implement these new techniques without worrying about backwards compatibility. At any rate, although it is not a direct API port, the API will feel very familiar and you should feel right at home using the Silverlight datagrid. We intend to also provide a WPF-compiled version of the Silverlight grid, so if you want to build for both platforms, you will have the option to do so with the Silverlight datagrid.
Want a quick point-by-point list of the features/goodies that we are aiming for? Here you go:
UI
- Ultra smooth and responsive tabular layout
- Multi-level grouping
- Sorting
- Filtering
- Sticky group containers
- Animated vertical and horizontal scrolling
- Fixed and scrollable headers and footers
- Easy group navigation (think something similar to the group-navigation control in Xceed DataGrid for WPF)
- Animated column reordering and resizing
- Row and cell selection
Data Virtualization
- Asynchronous data loading for continuously responsive UI
- Minimal (if at all) code required
- No discovery needed on remote data source
- Pre-fetching and caching of data
- Instant expanding and collapsing of groups
- Quick navigation through data source
- Support for almost any type of data source including WCF Data Services and WCF RIA Services
Editing
- Default editors for all the common data types
- Ability to create custom cell editor controls
- Validation (e.g., IDataErrorInfo, INotifyDataErrorInfo)
While you wait for the official launch of Xceed DataGrid for Silverlight, I will (hopefully) be blogging about specific features and how easily they can be used in any Silverlight application. I will also take you on indepth tours of some of the design concepts behind our latest baby
In order to get feedback from the community, we will be opening a private beta in March to make sure that we have the best possible product when it is officially released. If you are interested, send me an email to datagridbeta@xceed.com letting me know the type of project in which Xceed DataGrid for Silverlight would be used (e.g., new project, moving existing WPF project to Silverlight, replacing an existing grid) and the timeframe needed to make a decision, and I will sign you up for the beta.
Questions, comments, feature requests? Now's the time!
|
-
Ever since I started working in Silverlight, I found some strange ommissions, whether voluntary or not, in the Silverlight API. At times, this was very frustrating since I was expecting something as common as BindingList to be there. So, to end this week on a more "creative" note, I present you with an ode. Enjoy! Ode to the Hidden and Forgotten My head aches as I search for something new, Something to replace all the things they do. Yet Silverlight keeps thwarting all my plans, By hiding classes that I want to use. No longer can I batch initialize. Oh, where is ISupportInitialize? Why has IBindingList been abandoned? I don't want ObservableCollection! Why do you stop me from selecting styles? Is StyleSelector never to return? Triggers! Oh, dear Triggers! Where have you gone? Without you, I will have to manage states. And to all the others that are hidden, And to those that were simply forgotten: We will remember you and all you do, When we must search for something new to use.
|
-
So I didn't get much feedback from my post asking for help in regards to what to write, so I will go with the only suggestion I received and let you in on the upcoming features planned for the next major version of Xceed DataGrid for WPF.
So let's start with a feature that clients have been asking for since the virtualizing collection view was released: multiple selection! Yes ladies and gentlemen you will finally be able to select more than one row when using a virtualized source! Actually, the whole selection process is being revamped, so expect to see some (long awaited) changes including.... wait for it.... CELL SELECTION!
Performance! As if the grid was not already fast enough, get ready to see some performance enhancements in the standard table view!
Finally, after many many requests, the Live Explorer theme, which can be seen in the the Xceed DataGrid for WPF Live Explorer, is now included with Xceed DataGrid for WPF! Want more? How about a beautiful new Windows 7 theme? (I feel like I am on an infomercial!).

Another fantastic new addition is the print preview, which will allow users to take a look at their snazzy documents before sending them to the printer.
QTP? Did someone say QTP? You heard right! The upcoming edition of Xceed DataGrid for WPF will provide full QTP support!
Last, but definitely not least since I am most likely forgetting some, is the new group-navigation control, which replaces the previous group-navigation button, and provides quick and easy navigation between groups.
So which features are part of the Standard Edition and which ones are part of the Professional Edition? Glad you asked! Here's the breakdown:
Professional Edition Features
- Windows 7 and Xceed Live Explorer themes
- Print Preview
- Multiple selection when using data virtualization
- Group-navigation control
- QTP support
Standard Edition Features
- Improved performance in table view
- Cell selection
- Customizable cursors in most views
Of course, you can always check out our feature comparaison chart for the full list 
Enjoy!
|
-
Hello, my name is Jenny (@_random_) and I am a Twitter addict. Okay, not really and nothing even close to @kosmatos, but close enough that I check Twitter many times a day at work and on my iPhone to see what is going on. I don't follow many people and not many people follow me, but I like the interactions I have with those people and sometimes good conversations and suggestions come up. Sometimes I just write random stuff because I am bored. But I guess that if there is a point to Twitter, that is it.
So, ever since I have come back from the PDC, I have been using the Seesmic desktop client for Twitter, and although not perfect, it seemed to "do the job" although something was annoying me about it and yesterday I figured out what it was: the scrolling! When I scroll, I don't want to have to spend a few seconds finding the last tweet I was reading. It's annoying and it breaks the "flow". And so began my search for the perfect Twitter client this morning.
Now, if you are expecting an indepth review of Twitter clients, you are reading the wrong blog post. I didn't go looking for THE best Twitter client. I went looking for the best one for ME. So what was I looking for? I had no idea, but I figured I would know it when I saw it. So the first client I installed after uninstalling Seesmic was Tweetdeck, which many people at Xceed seem to enjoy using so I figured that it was probably a safe bet. A couple of minutes later, I was up and running with Tweetdeck and a couple of minutes later it was unistalled. Yes, it scrolled better than Seesmic but I found it hard to differentiate between my tweets, those that are replies to my tweets, and all the other noise. I really hate the new "Blend" themes (if that's what they are called). Use color people!! Black, white, and multiple shades of gray are not the best colors to use when you need to differentiate things. If you insist on using them, at least give me the option to change or customize them to something that I will like. Yes, I know this is a matter of opinion, but I told you I was looking for the perfect Twitter client for ME, not for YOU (I'm talking to you @superdupercat! )!
While on Tweetdeck, @ftdube sent me a tweet telling me to try Digsby, so I did. As soon as Tweedeck was uninstalled, I downloaded and installed Digsby. I would like to say that I actually tried it; however, when I attempted to add my MSN account in addition to my Twitter account (hey, it's also an IM client) it said my password was "too long". Excuse me? My password is too long? Ummm. No. I didn't even try it as a Twitter client. If it can't handle 24+ character passwords, it has no business being client for anything.
After my failed Digsby attempt, I took a look at the Twitter web interface to see what clients people were sending from. I saw many Tweetdecks and some Seesmic, but other than that it seemed to be all iPhone apps. "iPhone apps!! Maybe Twitterrific is available for Windows" I thought to myself. So off to the Twitterrific website I go only to be disappointed that there is no Windows version available. I love Twitterrific on my iPhone. It just works and it's easy to find/see what I am looking for. But alas, I was to be disappointed one more time.
At this point I am getting frustrated and thinking about going back to Seesmic since the only thing that actually bugged me was the scrolling. After quick consideration I decided to go back to the Twitter web site to see if they had a list of clients that they recommended. Lo and behold, right beside the listing for Twitterific was Twhirl. I had seen some tweets that originated from Twhirl before so I decided to try it out. Why? Honestly, because it looked pretty in the screenshot. No black/white/gray theme. 45 minutes later, I am still using it.
So what was I looking for? I think in the end it came out to "easy". I want it to be easy. I want to easily see what I tweeted, who replied, and whatnot without having to really think about it. The fact that it can stay on top of other windows (with or without opacity) and also that fact that it has a built-in spell checker just made it that much better for ME.
So that's it. My search for my "Perfect Twitter Client" has come to an end. For now 
|
-
For the second year in a row Xceed will be exhibiting and attending at PDC 2009! In addition to the amazing new features in the upcoming version of Xceed DataGrid for WPF, we will be demoing the latest development build of our future Silverlight grid.
This year we will be handing out snazy Xceed t-shirts and if you get spotted wearing one, you will be entered into 1 of the 3 draws to win a 16GB Zune HD video and MP3 player!

So if you want to come see what we've been working on, ask questions, make suggests for future releases, or simply chat with some of our team members make sure you stop by our booth! Also make sure you stop by Party with Palermo! We will be fresh off the plane but ready to party! 
See you in LA!
|
-
When we started writing blogs at Xceed, I think we all thought that we would always have interesting content to post about and that we could never run out of ideas. How wrong we were! For me, what I find the hardest is finding topics that will interest our current and future clients and that interest me as well! So here I am , more than a month since my last blog post and I have no ideas what to write about.
Now, this is where you come in! Tell me what you would like me to write about! Do you want to know more about a specific feature? About upcoming features? About developement at Xceed? A short story about kittens and unicorns? Something about me? About one of the developers?
Help!! 
|
-
Yes! Even with version 3.2 just out the door, the developers at Xceed have been hard at work on version 3.3, now officially version 3.5. So, what new features are being introduced in the latest version? I'm glad you asked! Among other features, the long awaited "smooth-scrolling table view" finally makes its debut in version 3.5. Known as the Tableflow view, this new view provides smooth, animated scrolling and column reordering as well as "sticky" group, grid, and detail headers and footers, which remain at the top and bottom of the grid until the next group or detail needs to be displayed. The "group-navigation" button, which is displayed in the group headers, can be clicked to have the first item in the group brought to the top of the viewport. Take a look! So what do you need to do to replace the classic Table view you have been using with the Tableflow view? Simple! Search and replace "TableView" with "TableflowView" and you're done! In addition to the Tableflow view, support for 2 new filter criteria has been added to the filter row: "starts with" and "ends width", which allow the content of a column to be filtered according to the values that start or end with the specified filter value. Another nice little feature that was added in version 3.5 is a notification glyph that is displayed when the grid is bound to a virtualizing collection view. This glyph (actually, it's 3 separate glyphs) are displayed when data is loaded into the grid, when data is being committed, and when there is an error. In the demo below, you can see the default glyph that is displayed when data is being loaded. Now, if you don't like the default connection-state glyphs, you can always replace them with the image of a kitten! Everyone likes kittens 
|
|
|
|
|