Skip to content

Commit

Permalink
Examples update
Browse files Browse the repository at this point in the history
  • Loading branch information
martinivanoff committed Oct 27, 2017
1 parent c67d68b commit 9c4bcb4
Show file tree
Hide file tree
Showing 17 changed files with 264 additions and 230 deletions.
4 changes: 2 additions & 2 deletions ComboBox/SelectedItemsBinding/Readme.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
## Selected Items Binding ##
##Selected Items Binding##
This example demonstrates how to bind the selected items of the RadComboBox control to a property in your ViewModel class.

<keywords:selected, items, binding>
<keywords:selected, items, binding>
5 changes: 2 additions & 3 deletions GridView/BindingSelectedItemsFromViewModel/App.xaml
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
<Application x:Class="WpfApplication1.App"
<Application x:Class="BindingSelectedItemsFromViewModel.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>

<Application.Resources>
</Application.Resources>
</Application>
12 changes: 2 additions & 10 deletions GridView/BindingSelectedItemsFromViewModel/App.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,7 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
using System.Windows;

namespace WpfApplication1
namespace BindingSelectedItemsFromViewModel
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}
Expand Down
6 changes: 2 additions & 4 deletions GridView/BindingSelectedItemsFromViewModel/App_SL.xaml
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SilverlightApplication1.App"
>
<Application.Resources>

x:Class="BindingSelectedItemsFromViewModel.App">
<Application.Resources>
</Application.Resources>
</Application>
11 changes: 1 addition & 10 deletions GridView/BindingSelectedItemsFromViewModel/App_SL.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SilverlightApplication1
namespace BindingSelectedItemsFromViewModel
{
public partial class App : Application
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
<ProjectTypeGuids>{A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>SilverlightApplication1</RootNamespace>
<AssemblyName>SilverlightApplication1</AssemblyName>
<RootNamespace>BindingSelectedItemsFromViewModel</RootNamespace>
<AssemblyName>BindingSelectedItemsFromViewModel</AssemblyName>
<TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier>
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
<SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
Expand All @@ -21,7 +21,7 @@
<GenerateSilverlightManifest>true</GenerateSilverlightManifest>
<XapFilename>SilverlightApplication1.xap</XapFilename>
<SilverlightManifestTemplate>Properties\AppManifest.xml</SilverlightManifestTemplate>
<SilverlightAppEntry>SilverlightApplication1.App</SilverlightAppEntry>
<SilverlightAppEntry>BindingSelectedItemsFromViewModel.App</SilverlightAppEntry>
<TestPageFileName>SilverlightApplication1TestPage.html</TestPageFileName>
<CreateTestPage>true</CreateTestPage>
<ValidateXaml>true</ValidateXaml>
Expand Down Expand Up @@ -72,35 +72,42 @@
<Reference Include="System.Windows.Data" />
<Reference Include="System.Xml" />
<Reference Include="System.Windows.Browser" />
<Reference Include="Telerik.Windows.Controls">
<HintPath>$(TELERIKSLDIR)\Binaries\Silverlight\Telerik.Windows.Controls.dll</HintPath>
</Reference>
<Reference Include="Telerik.Windows.Data">
<HintPath>$(TELERIKSLDIR)\Binaries\Silverlight\Telerik.Windows.Data.dll</HintPath>
</Reference>
<Reference Include="Telerik.Windows.Controls.Input">
<HintPath>$(TELERIKSLDIR)\Binaries\Silverlight\Telerik.Windows.Controls.Input.dll</HintPath>
</Reference>
<Reference Include="Telerik.Windows.Controls.GridView">
<HintPath>$(TELERIKSLDIR)\Binaries\Silverlight\Telerik.Windows.Controls.GridView.dll</HintPath>
</Reference>
<Reference Include="Telerik.Windows.Controls">
<HintPath>$(TELERIKSLDIR)\Binaries\Silverlight\Telerik.Windows.Controls.dll</HintPath>
</Reference>
<Reference Include="Telerik.Windows.Data">
<HintPath>$(TELERIKSLDIR)\Binaries\Silverlight\Telerik.Windows.Data.dll</HintPath>
</Reference>
<Reference Include="Telerik.Windows.Controls.Input">
<HintPath>$(TELERIKSLDIR)\Binaries\Silverlight\Telerik.Windows.Controls.Input.dll</HintPath>
</Reference>
<Reference Include="Telerik.Windows.Controls.GridView">
<HintPath>$(TELERIKSLDIR)\Binaries\Silverlight\Telerik.Windows.Controls.GridView.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="App_SL.xaml.cs">
<DependentUpon>App_SL.xaml</DependentUpon>
</Compile>
<Compile Include="Example.xaml.cs">
<DependentUpon>Example.xaml</DependentUpon>
</Compile>
<Compile Include="GridViewSelectionUtilities.cs" />
<Compile Include="MainPage.xaml.cs">
<DependentUpon>MainPage.xaml</DependentUpon>
</Compile>
<Compile Include="MyDataContext.cs" />
<Compile Include="MySelectedItemsBindingBehavior.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App_SL.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</ApplicationDefinition>
<Page Include="Example.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="MainPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
<ProjectGuid>{399D448B-7278-438B-AE04-F06423674DB2}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>WpfApplication1</RootNamespace>
<AssemblyName>WpfApplication1</AssemblyName>
<RootNamespace>BindingSelectedItemsFromViewModel</RootNamespace>
<AssemblyName>BindingSelectedItemsFromViewModel</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
Expand Down Expand Up @@ -57,6 +57,9 @@
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup>
<StartupObject>BindingSelectedItemsFromViewModel.App</StartupObject>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
Expand Down Expand Up @@ -89,6 +92,14 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="Example.xaml.cs">
<DependentUpon>Example.xaml</DependentUpon>
</Compile>
<Compile Include="GridViewSelectionUtilities.cs" />
<Page Include="Example.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
Expand All @@ -104,7 +115,6 @@
</ItemGroup>
<ItemGroup>
<Compile Include="MyDataContext.cs" />
<Compile Include="MySelectedItemsBindingBehavior.cs" />
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
Expand Down
25 changes: 25 additions & 0 deletions GridView/BindingSelectedItemsFromViewModel/Example.xaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<UserControl x:Class="BindingSelectedItemsFromViewModel.Example"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:BindingSelectedItemsFromViewModel"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="White">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="30" />
<RowDefinition />
</Grid.RowDefinitions>
<telerik:RadGridView ItemsSource="{Binding View}" SelectionMode="Extended" Margin="5"
local:GridViewSelectionUtilities.SelectedItems="{Binding SelectedItems}">
<telerik:RadGridView.Columns>
<telerik:GridViewSelectColumn />
</telerik:RadGridView.Columns>
</telerik:RadGridView>
<TextBlock Text="SelectedItems:" Margin="5" Grid.Row="1" />
<ListBox ItemsSource="{Binding SelectedItems}" DisplayMemberPath="ID" Grid.Row="2" Margin="5" />
</Grid>
</UserControl>
14 changes: 14 additions & 0 deletions GridView/BindingSelectedItemsFromViewModel/Example.xaml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using System.Windows.Controls;

namespace BindingSelectedItemsFromViewModel
{
public partial class Example : UserControl
{
public Example()
{
InitializeComponent();

DataContext = new MyDataContext();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Windows;
using Telerik.Windows.Controls;

namespace BindingSelectedItemsFromViewModel
{
public static class GridViewSelectionUtilities
{
private static bool isSyncingSelection;
private static List<Tuple<WeakReference, List<RadGridView>>> collectionToGridViews = new List<Tuple<WeakReference, List<RadGridView>>>();

public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.RegisterAttached(
"SelectedItems",
typeof(INotifyCollectionChanged),
typeof(GridViewSelectionUtilities),
new PropertyMetadata(null, OnSelectedItemsChanged));

public static INotifyCollectionChanged GetSelectedItems(DependencyObject obj)
{
return (INotifyCollectionChanged)obj.GetValue(SelectedItemsProperty);
}

public static void SetSelectedItems(DependencyObject obj, INotifyCollectionChanged value)
{
obj.SetValue(SelectedItemsProperty, value);
}

private static void OnSelectedItemsChanged(DependencyObject target, DependencyPropertyChangedEventArgs args)
{
var gridView = (RadGridView)target;

var oldCollection = args.OldValue as INotifyCollectionChanged;
if (oldCollection != null)
{
gridView.SelectionChanged -= GridView_SelectionChanged;
oldCollection.CollectionChanged -= SelectedItems_CollectionChanged;
RemoveAssociation(oldCollection, gridView);
}

var newCollection = args.NewValue as INotifyCollectionChanged;
if (newCollection != null)
{
gridView.SelectionChanged += GridView_SelectionChanged;
newCollection.CollectionChanged += SelectedItems_CollectionChanged;
AddAssociation(newCollection, gridView);
OnSelectedItemsChanged(newCollection, null, (IList)newCollection);
}
}

private static void SelectedItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs args)
{
INotifyCollectionChanged collection = (INotifyCollectionChanged)sender;
OnSelectedItemsChanged(collection, args.OldItems, args.NewItems);
}

private static void GridView_SelectionChanged(object sender, SelectionChangeEventArgs args)
{
if (isSyncingSelection)
{
return;
}

var collection = (IList)GetSelectedItems((RadGridView)sender);
foreach (object item in args.RemovedItems)
{
collection.Remove(item);
}
foreach (object item in args.AddedItems)
{
collection.Add(item);
}
}

private static void OnSelectedItemsChanged(INotifyCollectionChanged collection, IList oldItems, IList newItems)
{
isSyncingSelection = true;

var gridViews = GetOrCreateGridViews(collection);
foreach (var gridView in gridViews)
{
SyncSelection(gridView, oldItems, newItems);
}

isSyncingSelection = false;
}

private static void SyncSelection(RadGridView gridView, IList oldItems, IList newItems)
{
if (oldItems != null)
{
SetItemsSelection(gridView, oldItems, false);
}

if (newItems != null)
{
SetItemsSelection(gridView, newItems, true);
}
}

private static void SetItemsSelection(RadGridView gridView, IList items, bool shouldSelect)
{
foreach (var item in items)
{
bool contains = gridView.SelectedItems.Contains(item);
if (shouldSelect && !contains)
{
gridView.SelectedItems.Add(item);
}
else if (contains && !shouldSelect)
{
gridView.SelectedItems.Remove(item);
}
}
}

private static void AddAssociation(INotifyCollectionChanged collection, RadGridView gridView)
{
List<RadGridView> gridViews = GetOrCreateGridViews(collection);
gridViews.Add(gridView);
}

private static void RemoveAssociation(INotifyCollectionChanged collection, RadGridView gridView)
{
List<RadGridView> gridViews = GetOrCreateGridViews(collection);
gridViews.Remove(gridView);

if (gridViews.Count == 0)
{
CleanUp();
}
}

private static List<RadGridView> GetOrCreateGridViews(INotifyCollectionChanged collection)
{
for (int i = 0; i < collectionToGridViews.Count; i++)
{
var wr = collectionToGridViews[i].Item1;
if (wr.Target == collection)
{
return collectionToGridViews[i].Item2;
}
}

collectionToGridViews.Add(new Tuple<WeakReference, List<RadGridView>>(new WeakReference(collection), new List<RadGridView>()));
return collectionToGridViews[collectionToGridViews.Count - 1].Item2;
}

private static void CleanUp()
{
for (int i = collectionToGridViews.Count - 1; i >= 0; i--)
{
bool isAlive = collectionToGridViews[i].Item1.IsAlive;
var behaviors = collectionToGridViews[i].Item2;
if (behaviors.Count == 0 || !isAlive)
{
collectionToGridViews.RemoveAt(i);
}
}
}
}
}
Loading

0 comments on commit 9c4bcb4

Please sign in to comment.