This question is locked. New answers and comments are not allowed.
In the project I use Silverlight4, Telerik Q1 2011: RadGridView, MVVM, WCF RIA Service, ORM EF 4 code first CTP 5
1. Domain Model Layer: POCO class:
2. Data Access Layer: DbContext
3. Domain Service Layer: WCF RIA Service WCF RIA Services with EF4 CTP5
RegAssignService.cs
RegAssignService.metadata.cs
4. Silverlight Navigate Application - View Layer:
RegAssignView.xaml on blog's Support MVVM and Domain Data Source MVVM support
RegAssign.xaml.cs
5 View Model Layer
RegAssignViewModel
In my View RadButtons in RadGridView does not work at any variants of a binding and implemenation of commands to ViewModel!
My request:
Very simple example of implementation in ViewModel CRUD сommands RadGridView
using magic QueryableDomainServiceCollectionView
Thanks
1. Domain Model Layer: POCO class:
// My Register ModBus Protocol
public partial class RegAssign { [Key] public long Id { get; set; } public string Code { get; set; } public string Description { get; set; } public int ModBusReg { get; set; } public int MinRegNum { get; set; } public int MaxRegNum { get; set; } } public class EFContext : DbContext { public EFContext() : base("ApplicationServices") { Configuration.LazyLoadingEnabled = false; } public DbSet<RegAssign> RegAssigns { get; set; } }RegAssignService.cs
[EnableClientAccess()] public class RegAssignDomainService : DomainService { public RegAssignDomainService() { this.Container = new EFContext(); } private EFContext Container { get; set; } protected override void Dispose(bool disposing) { if (disposing) { this.Container.Dispose(); } base.Dispose(disposing); } protected override bool PersistChangeSet() { this.Container.SaveChanges(); return base.PersistChangeSet(); } public ObjectContext ObjectContext { get { return ((IObjectContextAdapter)this).ObjectContext; } } public IEnumerable<RegAssign> GetRegAssigns() { return this.Container.RegAssigns.OrderBy(a => a.ModBusReg).ToList(); } public void InsertRegAssign(RegAssign obj) { this.Container.Insert(obj); } public void UpdateRegAssign(RegAssign currentRegAssign) { this.Container.Update(currentRegAssign, this.ChangeSet.GetOriginal(currentRegAssign)); } public void DeleteRegAssign(RegAssign obj) { this.Container.Delete(obj); } private static Expression<Func<RegAssign, string>> CreateSelectorExpression(string propertyName) { var paramterExpression = Expression.Parameter(typeof(RegAssign)); return (Expression<Func<RegAssign, string>>)Expression.Lambda(Expression.PropertyOrField(paramterExpression, propertyName), paramterExpression); } } [MetadataType(typeof(RegAssignMetadata))] public class RegAssign { #region Nested type: RegAssignMetadata internal sealed class RegAssignMetadata { // Metadata classes are not meant to be instantiated. private RegAssignMetadata() { } public long Id { get; set; } public string Code { get; set; } public string Description { get; set; } public int ModBusReg { get; set; } public int MinRegNum { get; set; } public int MaxRegNum { get; set; } } #endregion } RegAssignView.xaml on blog's Support MVVM and Domain Data Source MVVM support
<Grid x:Name="LayoutRoot"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition /> </Grid.RowDefinitions> <Border telerikQuickStart:ThemeAwareBackgroundBehavior.IsEnabled="True" Grid.RowSpan="2" /> <StackPanel Name="ConfigurationPanel" Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,5,0,0"> <telerik:RadButton Width="150" Content="Delete selected" Margin="0,0,5,0" Command="{Binding DeleteCommand}" CommandParameter="{Binding ElementName=mainGrid, Path=SelectedItem}" Visibility="{Binding IsDeleteCommandAvailable, Converter={StaticResource BooleanToVisibilityConverter}}" /> <telerik:RadButton Width="150" Content="Add New" Margin="0,0,5,0" Command="{Binding DeleteCommand}" CommandParameter="{Binding ElementName=mainGrid, Path=SelectedItem}" Visibility="{Binding IsInsertCommandAvailable, Converter={StaticResource BooleanToVisibilityConverter}}" /> <telerik:RadButton Width="150" Content="Save edit" Margin="0,0,5,0" Command="telerikGrid:RadGridViewCommands.CommitEdit" CommandTarget="{Binding ElementName=mainGrid}" /> <telerik:RadButton Width="150" Content="Cancel edit" Command="telerikGrid:RadGridViewCommands.CancelRowEdit" CommandTarget="{Binding ElementName=mainGrid}" /> </StackPanel> <!-- SelectionMode="Extended" --> <telerik:RadGridView x:Name="mainGrid" ItemsSource="{Binding View}" SelectedItem="{Binding SelectedItem}" AutoGenerateColumns="False" Margin="0,5,0,0" Grid.Row="1" ActionOnLostFocus="None" CanUserDeleteRows="True" IsReadOnly="False" > <telerik:RadGridView.Columns> <telerik:GridViewDataColumn DataMemberBinding="{Binding Code}" Header="Code"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding ModBusReg}" Header="Mod Bus Register"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding MinRegNum}" Header="Min Register"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding MaxRegNum}" Header="Max Register"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding Description}" Header="Description" Width="*"/> <telerik:GridViewColumn> <telerik:GridViewColumn.CellTemplate> <DataTemplate> <telerik:RadButton Content="Delete" Command="telerikGrid:RadGridViewCommands.Delete" CommandParameter="{Binding ElementName=mainGrid, Path=SelectedItem}" /> </DataTemplate> </telerik:GridViewColumn.CellTemplate> </telerik:GridViewColumn> </telerik:RadGridView.Columns> </telerik:RadGridView> </Grid>RegAssign.xaml.cs
public partial class RegAssign : Page { public RegAssign() { InitializeComponent(); this.mainGrid.Items.DescriptorsSynchronizationMode = SynchronizationMode.TwoWay; RegAssignViewModel viewModel = new RegAssignViewModel(); this.mainGrid.DataContext = viewModel; this.ConfigurationPanel.DataContext = viewModel; } } 5 View Model Layer
RegAssignViewModel
public class RegAssignViewModel : ViewModelBase { private QueryableDomainServiceCollectionView<RegAssign> view; private IEnumerable<RegAssign> selectedItems; private DelegateCommand loadCommand; private ICommand insertCommand; private ICommand deleteCommand; private ICommand saveCommand; private ICommand cancelCommand; private RegAssignDomainContext context; public RegAssignViewModel() { context = new RegAssignDomainContext(); EntityQuery<RegAssign> getQuery = context.GetRegAssignsQuery(); this.view = new QueryableDomainServiceCollectionView<RegAssign>(context, getQuery); this.view.PageSize = 10; this.view.AutoLoad = true; this.view.PropertyChanged += this.OnViewPropertyChanged; this.loadCommand = new DelegateCommand(this.ExecuteLoadCommand, this.LoadCommandCanExecute); this.insertCommand = new DelegateCommand((o) => { view.AddNew(o ?? new RegAssign()); }); //RadGridViewCommands.BeginInsert; this.saveCommand = RadGridViewCommands.CommitEdit; this.cancelCommand = RadGridViewCommands.CancelRowEdit; this.deleteCommand = RadGridViewCommands.Delete; /* this.insertCommand = new DelegateCommand(this.ExecuteInsertCommand, this.InsertCommandCanExecute); //this.editCommand = new DelegateCommand(this.ExecuteEditCommand, this.EditCommandCanExecute); this.deleteCommand = new DelegateCommand(this.ExecuteDeleteCommand, this.DeleteCommandCanExecute); this.saveCommand = new DelegateCommand(this.ExecuteSaveCommand, this.SaveCommandCanExecute); this.cancelCommand = new DelegateCommand(this.ExecuteCancelCommand, this.CancelCommandCanExecute); */ } public IEnumerable View { get { return this.view; } } public RegAssign SelectedItem { get { return (RegAssign)this.view.CurrentItem; } } public int PageSize { get { return this.view.PageSize; } set { if (this.view.PageSize != value) { this.view.PageSize = value; this.OnPropertyChanged(m => m.PageSize); } } } public bool AutoLoad { get { return this.view.AutoLoad; } set { if (this.view.AutoLoad != value) { this.view.AutoLoad = value; this.OnPropertyChanged(m => m.AutoLoad); } } } public ICommand InsertCommand { get { return insertCommand; } } /* My unsuccessful implementation of an inserting command RadGridView public bool IsInsertCommandAvailable { get { return InsertCommandCanExecute(null); } } public ICommand InsertCommand { get { return insertCommand; } } private void ExecuteInsertCommand(object o) { view.AddNew((RegAssign)o ?? new RegAssign()); } private bool InsertCommandCanExecute(object o) { return view.CanAddNew; } */ public bool IsBusy { get { return view.IsBusy; } } public bool CanLoad { get { return view.CanLoad; } } public ICommand LoadCommand { get { return loadCommand; } } private void ExecuteLoadCommand(object o) { view.Load(); } private bool LoadCommandCanExecute(object o) { return CanLoad && ! AutoLoad; } private void OnViewPropertyChanged(object sender, PropertyChangedEventArgs e) { switch (e.PropertyName) { case "CanLoad": this.loadCommand.InvalidateCanExecute(); break; case "IsBusy": case "AutoLoad": this.OnPropertyChanged(e.PropertyName); this.loadCommand.InvalidateCanExecute(); break; default: this.OnPropertyChanged(e.PropertyName); break; } }In my View RadButtons in RadGridView does not work at any variants of a binding and implemenation of commands to ViewModel!
My request:
Very simple example of implementation in ViewModel CRUD сommands RadGridView
using magic QueryableDomainServiceCollectionView
Thanks