7 Answers, 1 is accepted
0
Hi,
Vlad
the Telerik team
You can use CellStyleSelector and RowStyleSelector to set IsEnabled property depending on your condition.
Regards,Vlad
the Telerik team
Do you want to have your say when we set our development plans?
Do you want to know when a feature you care about is added or when a bug fixed?
Explore the
Telerik Public Issue Tracking
system and vote to affect the priority of the items
0
sam Aryan
Top achievements
Rank 1
answered on 31 Aug 2010, 05:48 PM
Hi Vlad,
Can you please provide me with a sample solution. I have been trying to implement it by myself but so far without success.
Cheers,
Farzin
Can you please provide me with a sample solution. I have been trying to implement it by myself but so far without success.
Cheers,
Farzin
0
Hi,
Vlad
the Telerik team
The sample code can be found in both examples I've posted in my previous reply. What kind if problems you have? Can you post what you've tried (your code)?
Best wishes,Vlad
the Telerik team
Do you want to have your say when we set our development plans?
Do you want to know when a feature you care about is added or when a bug fixed?
Explore the
Telerik Public Issue Tracking
system and vote to affect the priority of the items
0
Jerry T.
Top achievements
Rank 1
answered on 01 Jul 2011, 04:30 PM
That sample solution is not a solution. It's some code snippets.
It doesn't show the code for the converter.
It also doesn't follow MVVM.
Can Telerik post FULL solutions using MVVM for samples when people request them? It would REALLY help out those of us new to the MVVM method.
It doesn't show the code for the converter.
It also doesn't follow MVVM.
Can Telerik post FULL solutions using MVVM for samples when people request them? It would REALLY help out those of us new to the MVVM method.
0
Hello,
Vlad
the Telerik team
Style and Template selectors and IValueConverters are actually pure MVVM. You may need to check your local version of our demos for more info.
Best wishes,Vlad
the Telerik team
Do you want to have your say when we set our development plans?
Do you want to know when a feature you care about is added or when a bug fixed?
Explore the
Telerik Public Issue Tracking
system and vote to affect the priority of the items
0
Jerry T.
Top achievements
Rank 1
answered on 05 Jul 2011, 03:36 PM
Hello.
I have the Demo code (for Q1 2011 and the Q2 2011 as well) and there's nothing in there that follows the full MVVM methodology.
This is how I have it working as of now, though (the disabling/enabling of cells is in the View's Code Behind, along with code for binding a ComboBox to a different data source when the GridView is in Edit mode):
Web App: DMCpro.Web.App
Domain Service:
Silverlight Project Name: DMCpro.Silverlight.ServiceCostingSheet
VIEW - XAML
VIEW - Code Behind
VIEWMODEL - MainViewModel.cs
VIEWMODEL - ViewModel for GridView control
VIEWMODEL - GridView Edit mode RadComboBox
MODEL - Proxy
MODEL - Interface for Proxy
MainPage - Code Behind
MainPage.XAML
I have the Demo code (for Q1 2011 and the Q2 2011 as well) and there's nothing in there that follows the full MVVM methodology.
This is how I have it working as of now, though (the disabling/enabling of cells is in the View's Code Behind, along with code for binding a ComboBox to a different data source when the GridView is in Edit mode):
Web App: DMCpro.Web.App
Domain Service:
Imports System.ServiceModel.DomainServices.HostingImports System.ServiceModel.DomainServices.ServerNamespace Services <EnableClientAccess()> <RequiresAuthentication()> Public Class CostingSheetDomainService Inherits DomainService#Region "Public Methods" Public Function GetDefaultCostingSheets() As IEnumerable(Of Model.DefaultCostingSheet) Me.EnsurePrincipal() Return ( From i In BAL.GetCostingSheetsDefaultCostingSheets() Select New Model.DefaultCostingSheet() With { .DefaultCostingSheetId = i.DefaultCostingSheetId, .DefaultCostingSheetName = i.DefaultCostingSheetName, .ServiceType = i.ServiceType, .OfficeName = i.OfficeName, .ProgramLocation = i.ProgramLocation, .Year = i.Year, .Pax = i.Pax, .DateCreated = i.DateCreated, .DateUpdated = i.DateUpdated, .IsActive = i.IsActive } ) End Function Public Function GetServiceCostingSheet(lineNumber As Integer, status As String) As IEnumerable(Of Model.ServiceCostingSheet) Me.EnsurePrincipal() Return ( From i In BAL.GetProgramsCostingSheetsForService(lineNumber, status) Select New Model.ServiceCostingSheet() With { .fldCostingSheetID = i.fldCostingSheetID, .fldCostingSheetHeaderID = i.fldCostingSheetHeaderID, .fldServiceVenueItemID = i.fldServiceVenueItemID, .fldCategory = i.fldCategory, .CostCatAbv = i.CostCatAbv, .fldCostingItem = i.fldCostingItem, .fldCostPerUnit = i.fldCostPerUnit, .fldHours = i.fldHours, .fldGratuity = i.fldGratuity, .fldUnits = i.fldUnits, .fldTax = i.fldTax, .fldTaxable = i.fldTaxable, .fldCost = i.fldCost, .GP = i.GP, .fldUnitRev = i.fldUnitRev, .PricingOption = i.PricingOption, .fldRevenue = i.fldRevenue, .fldRevPerPerson = i.fldRevPerPerson, .fldCommOpt = i.fldCommOpt, .CommOption = i.CommOption, .BillType = i.BillType, .fldGroupType = i.fldGroupType, .fldSortOrder = i.fldSortOrder, .VendorName = i.VendorName, .fldPricingOptionID = i.fldPricingOptionID, .fldBilltype = i.fldBilltype, .fldTax1 = i.fldTax1, .fldTax2 = i.fldTax2, .fldVendorID = i.fldVendorID, .fldAmtVendorPd = i.fldAmtVendorPd, .Status = i.Status, .fldCommClient = i.fldCommClient, .fldCommHotel = i.fldCommHotel, .fldClientCommRate = i.fldClientCommRate, .fldHotelCommRate = i.fldHotelCommRate } ) End Function Public Function GetCostingSheetPricingOptions() As IEnumerable(Of Model.CostingSheetPricingOptions) Me.EnsurePrincipal() Return ( From i In BAL.GetCostingSheetPricingOptions() Select New Model.CostingSheetPricingOptions() With { .PricingOptionID = i.PricingOptionID, .PricingOption = i.PricingOption } ) End Function Public Function GetCostingSheetBillTypes() As IEnumerable(Of Model.CostingSheetBillTypes) Me.EnsurePrincipal() Return ( From i In BAL.GetCostingBillTypes() Select New Model.ServiceCostingSheet() With { .fldBilltype = i.BillTypeID, .BillType = i.BillType } ) End Function Public Function GetCostingSheetCommissionOptions() As IEnumerable(Of Model.CostingSheetCommissionOptions) Me.EnsurePrincipal() Return ( From i In BAL.GetCostingCommissionOptions() Select New Model.ServiceCostingSheet() With { .fldCommOpt = i.CommOptionID, .CommOption = i.CommOption } ) End Function#End Region#Region "Private Methods" Private Sub EnsurePrincipal() Threading.Thread.CurrentPrincipal = ServiceContext.User End Sub Protected Overrides Function Count(Of T)(query As System.Linq.IQueryable(Of T)) As Int32 Return query.Count() End Function#End Region End ClassEnd NamespaceSilverlight Project Name: DMCpro.Silverlight.ServiceCostingSheet
VIEW - XAML
<UserControl x:Class="DMCpro.Silverlight.ServiceCostingSheet.View.ServiceCostingSheetView" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <UserControl.Resources> <Style x:Key="CostingSheetLabelBorder" TargetType="Border"> <Setter Property="CornerRadius" Value="10" /> <Setter Property="Background" Value="#FFDEDEDE" /> <Setter Property="Margin" Value="0,0,5,0" /> <Setter Property="Grid.Column" Value="0" /> </Style> <Style x:Key="CostingSheetLabel" TargetType="TextBlock"> <Setter Property="Foreground" Value="#FF14517B" /> <Setter Property="Margin" Value="10,3,0,0" /> </Style> </UserControl.Resources> <Grid x:Name="LayoutRoot" Background="White"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Grid.Effect> <DropShadowEffect Color="Gray" Direction="0" ShadowDepth="0" BlurRadius="20" Opacity="1" /> </Grid.Effect> <telerik:RadGridView EnableColumnVirtualization="False" x:Name="rgvProgramServiceCostingSheet" Grid.Row="0" CanUserFreezeColumns="False" AutoGenerateColumns="False" IsFilteringAllowed="False" ItemsSource="{Binding ServiceCostingSheets}" EditTriggers="CellClick" RowLoaded="rgvProgramServiceCostingSheet_RowLoaded" Loaded="rgvProgramServiceCostingSheet_Loaded" AllowDrop="False" ScrollMode="RealTime" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" ShowGroupPanel="False" RowDetailsVisibilityMode="Visible"> <telerik:RadGridView.Columns> <telerik:GridViewDataColumn DataMemberBinding="{Binding Model.VendorName}" Header="Vendor" Width="150" EditTriggers="CellClick" UniqueName="VendorName" > <telerik:GridViewDataColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Model.VendorName}" /> </DataTemplate> </telerik:GridViewDataColumn.CellTemplate> <telerik:GridViewDataColumn.CellEditTemplate> <DataTemplate> <TextBox Text="{Binding Model.VendorName, Mode=OneWay}" /> </DataTemplate> </telerik:GridViewDataColumn.CellEditTemplate> </telerik:GridViewDataColumn> <telerik:GridViewDataColumn DataMemberBinding="{Binding Model.fldCostingItem}" Header="Costing Item" Width="200" EditTriggers="CellClick"> <telerik:GridViewDataColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Model.fldCostingItem}" /> </DataTemplate> </telerik:GridViewDataColumn.CellTemplate> <telerik:GridViewDataColumn.CellEditTemplate> <DataTemplate> <TextBox Text="{Binding Model.fldCostingItem, Mode=TwoWay}" /> </DataTemplate> </telerik:GridViewDataColumn.CellEditTemplate> </telerik:GridViewDataColumn> <telerik:GridViewMaskedTextBoxColumn DataMemberBinding="{Binding Model.fldCostPerUnit}" Mask="c2" DataFormatString="{}{0:C2}" Header="Unit Cost" Width="95" HeaderTextAlignment="Right" TextAlignment="Right" UniqueName="fldCostPerUnit" /> <telerik:GridViewMaskedTextBoxColumn DataMemberBinding="{Binding Model.fldUnits}" Mask="n0" Header="Units" Width="45" HeaderTextAlignment="Right" TextAlignment="Right" /> <telerik:GridViewMaskedTextBoxColumn DataMemberBinding="{Binding Model.fldHours}" Mask="n0" Header="Hours" Width="45" HeaderTextAlignment="Right" TextAlignment="Right" /> <telerik:GridViewMaskedTextBoxColumn DataMemberBinding="{Binding Model.fldGratuity}" Mask="c2" DataFormatString="{}{0:C2}" Header="Gratuity" Width="95" HeaderTextAlignment="Right" TextAlignment="Right" /> <telerik:GridViewMaskedTextBoxColumn DataMemberBinding="{Binding Model.fldTax}" Mask="p3" DataFormatString="{}{0:P3}" Header="Tax" Width="95" HeaderTextAlignment="Right" TextAlignment="Right" /> <telerik:GridViewCheckBoxColumn DataMemberBinding="{Binding Model.fldTaxable}" Header="Tax?" Width="45" EditTriggers="CellClick" /> <telerik:GridViewMaskedTextBoxColumn DataMemberBinding="{Binding Model.fldCost}" Mask="c" DataFormatString="{}{0:C2}" Header="Cost" Width="95" HeaderTextAlignment="Right" TextAlignment="Right" /> <telerik:GridViewMaskedTextBoxColumn DataMemberBinding="{Binding Model.GP}" Mask="p0" DataFormatString="{}{0:P0}" Header="GP%" Width="45" HeaderTextAlignment="Right" TextAlignment="Right" /> <telerik:GridViewMaskedTextBoxColumn DataMemberBinding="{Binding Model.fldUnitRev}" Mask="c2" DataFormatString="{}{0:C2}" Header="Unit Rev" Width="95" HeaderTextAlignment="Right" TextAlignment="Right" /> <telerik:GridViewComboBoxColumn x:Name="rcbPricingOption" DataMemberBinding="{Binding Model.PricingOption}" Header="Pricing" Width="100"> <telerik:GridViewComboBoxColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Model.PricingOption}" /> </DataTemplate> </telerik:GridViewComboBoxColumn.CellTemplate> <telerik:GridViewComboBoxColumn.CellEditTemplate> <DataTemplate> <ComboBox x:Name="cbPricingOption" Loaded="cbPricingOption_Loaded" /> </DataTemplate> </telerik:GridViewComboBoxColumn.CellEditTemplate> </telerik:GridViewComboBoxColumn> <telerik:GridViewMaskedTextBoxColumn DataMemberBinding="{Binding Model.fldRevenue}" Mask="c2" DataFormatString="{}{0:C2}" Header="Revenue" Width="95" HeaderTextAlignment="Right" TextAlignment="Right" /> <telerik:GridViewMaskedTextBoxColumn DataMemberBinding="{Binding Model.fldRevPerPerson}" Mask="c2" DataFormatString="{}{0:C2}" Header="Rev PP" Width="95" HeaderTextAlignment="Right" TextAlignment="Right" /> <telerik:GridViewComboBoxColumn x:Name="rcbCommOption" DataMemberBinding="{Binding Model.CommOption}" Header="Comm" Width="100"> <telerik:GridViewComboBoxColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Model.CommOption}" /> </DataTemplate> </telerik:GridViewComboBoxColumn.CellTemplate> <telerik:GridViewComboBoxColumn.CellEditTemplate> <DataTemplate> <ComboBox DisplayMemberPath="CommOption" SelectedValuePath="CommOptionID" SelectedValue="{Binding Model.fldCommOpt, Mode=TwoWay}" ItemsSource="{Binding CommissionOptions, Source={StaticResource CommissionOptionsList}}" /> </DataTemplate> </telerik:GridViewComboBoxColumn.CellEditTemplate> </telerik:GridViewComboBoxColumn> <telerik:GridViewComboBoxColumn x:Name="rcbBillType" DataMemberBinding="{Binding Model.BillType}" Header="Bill Type" Width="75"> <telerik:GridViewComboBoxColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Model.BillType}" /> </DataTemplate> </telerik:GridViewComboBoxColumn.CellTemplate> <telerik:GridViewComboBoxColumn.CellEditTemplate> <DataTemplate> <ComboBox DisplayMemberPath="BillType" SelectedValuePath="BillTypeID" SelectedValue="{Binding Model.fldBilltype, Mode=TwoWay}" ItemsSource="{Binding BillTypes, Source={StaticResource BillTypesList}}" /> </DataTemplate> </telerik:GridViewComboBoxColumn.CellEditTemplate> </telerik:GridViewComboBoxColumn> <telerik:GridViewMaskedTextBoxColumn DataMemberBinding="{Binding Model.fldGroupType}" Header="Group" Width="45" HeaderTextAlignment="Right" TextAlignment="Right" /> <telerik:GridViewMaskedTextBoxColumn DataMemberBinding="{Binding Model.fldSortOrder}" Header="Sort" Width="45" HeaderTextAlignment="Right" TextAlignment="Right" /> </telerik:RadGridView.Columns> </telerik:RadGridView> <StackPanel Grid.Row="1" Orientation="Horizontal"> <Border Style="{StaticResource CostingSheetLabelBorder}"> <TextBlock x:Name="TaxLabel" Style="{StaticResource CostingSheetLabel}"/> </Border> <Border Style="{StaticResource CostingSheetLabelBorder}"> <TextBlock x:Name="CostLabel" Style="{StaticResource CostingSheetLabel}"/> </Border> <Border Style="{StaticResource CostingSheetLabelBorder}"> <TextBlock x:Name="RevenueLabel" Style="{StaticResource CostingSheetLabel}"/> </Border> <Border Style="{StaticResource CostingSheetLabelBorder}"> <TextBlock x:Name="RevPerPersonLabel" Style="{StaticResource CostingSheetLabel}"/> </Border> <Border Style="{StaticResource CostingSheetLabelBorder}"> <TextBlock x:Name="GPLabel" Style="{StaticResource CostingSheetLabel}"/> </Border> </StackPanel> </Grid></UserControl>VIEW - Code Behind
using System;using System.Collections.Generic;using System.Collections.ObjectModel;using System.Windows;using System.Windows.Browser;using System.Windows.Controls;using Telerik.Windows.Controls;using Telerik.Windows.Controls.GridView;using DMCpro.Silverlight.ServiceCostingSheet.Model;using DMCpro.Silverlight.ServiceCostingSheet.ViewModel;using DMCpro.Silverlight.CostingSheetPricingOptions.ViewModel;namespace DMCpro.Silverlight.ServiceCostingSheet.View{ public partial class ServiceCostingSheetView : UserControl { private decimal m_Tax = 0; private decimal m_Cost = 0; private decimal m_Revenue = 0; private decimal m_RevPerPerson = 0; private decimal m_CommTTL = 0; private decimal m_HotelCommRate = 0; private decimal m_HotelCommTTL = 0; private decimal m_OtherComm = 0; private decimal m_OtherCommTTL = 0; private string m_NewAssignedTo = string.Empty; private string m_CostingSheetType = string.Empty; private int m_newPricingOption = 0; private int m_newCommOption = 0; private int m_newBillType = 0; #region Constructor public ServiceCostingSheetView() { InitializeComponent(); int lineNumber = Convert.ToInt32(HtmlPage.Document.GetElementById("hiddenLineNumber").GetProperty("Value")); string status = HtmlPage.Document.GetElementById("hiddenStatus").GetProperty("Value").ToString(); this.DataContext = new MainViewModel(new ServiceCostingSheetServiceProxy(lineNumber, status)); } #endregion private void rgvProgramServiceCostingSheet_RowLoaded(object sender, Telerik.Windows.Controls.GridView.RowLoadedEventArgs e) { if ((e.Row is GridViewRow)) { GridViewRow gvr = (GridViewRow)e.Row; var cells = (e.Row as GridViewRow).ChildrenOfType<GridViewCell>(); var dataItem = (e.DataElement as ServiceCostingSheetViewModel).Model; decimal Tax1 = dataItem.fldTax1; decimal Tax2 = dataItem.fldTax2; m_Tax += Tax1 + Tax2; m_Cost += dataItem.fldCost; m_Revenue += dataItem.fldRevenue; m_RevPerPerson += dataItem.fldRevPerPerson; m_CommTTL += dataItem.fldCommHotel + dataItem.fldCommClient; switch ((string)cells[11].Value) { case "TTLRev": //Total Revenue cells[9].IsEnabled = false; cells[10].IsEnabled = false; cells[12].IsEnabled = true; break; case "TTLRevLock": //Total Revenue Locked cells[9].IsEnabled = false; cells[10].IsEnabled = false; cells[12].IsEnabled = true; break; case "UnitRev": //Unit Revenue cells[9].IsEnabled = false; cells[10].IsEnabled = true; cells[12].IsEnabled = false; break; default: //GP% or other cells[9].IsEnabled = true; cells[10].IsEnabled = false; cells[12].IsEnabled = false; break; } // If Vendor has made payments, disable changes if (dataItem.fldAmtVendorPd != 0) { cells[0].IsEnabled = false; } TaxLabel.Text = "Tax: " + m_Tax.ToString(); CostLabel.Text = "Cost: " + m_Cost.ToString(); RevenueLabel.Text = "Rev: " + m_Revenue.ToString(); RevPerPersonLabel.Text = "Rev PP: " + m_RevPerPerson.ToString(); GPLabel.Text = "GP Sub: " + (m_Revenue - m_Cost).ToString(); } } private void rgvProgramServiceCostingSheet_Loaded(object sender, System.EventArgs e) { } private void cbPricingOption_Loaded(object sender, RoutedEventArgs e) { ComboBox cbPricingOption = (ComboBox)sender; cbPricingOption.ItemsSource = (this.DataContext as MainViewModel).CostingSheetPricingOptions; cbPricingOption.SelectedValuePath = "Model.PricingOptionID"; cbPricingOption.DisplayMemberPath = "Model.PricingOption"; cbPricingOption.SelectedValue = (rgvProgramServiceCostingSheet.Items.CurrentEditItem as ServiceCostingSheetViewModel).Model.fldPricingOptionID; } }}VIEWMODEL - MainViewModel.cs
using System;using System.ComponentModel;using System.Collections.Generic;using System.Collections.ObjectModel;using DMCpro.Silverlight.MvvmHelpers;using DMCpro.Silverlight.ServiceCostingSheet.Model;using DMCpro.Silverlight.ServiceCostingSheet.ViewModel;using DMCpro.Silverlight.CostingSheetPricingOptions.ViewModel;using DMCpro.Web.App.Model;namespace DMCpro.Silverlight.ServiceCostingSheet.ViewModel{ public class MainViewModel : ViewModelBase { public ObservableCollection<ServiceCostingSheetViewModel> ServiceCostingSheets { get; private set; } public List<CostingSheetPricingOptionsViewModel> CostingSheetPricingOptions { get { return _CostingSheetPricingOptions; } set { _CostingSheetPricingOptions = value; } } private List<CostingSheetPricingOptionsViewModel> _CostingSheetPricingOptions; /// <summary> /// The <see cref="ErrorMessage" /> property's name. /// </summary> public const string ErrorMessagePropertyName = "ErrorMessage"; private string _errorMessage = string.Empty; /// <summary> /// Gets the ErrorMessage property. /// Changes to that property's value raise the PropertyChanged event. /// </summary> public string ErrorMessage { get { return _errorMessage; } set { if (_errorMessage == value) return; _errorMessage = value; RaisePropertyChanged(ErrorMessagePropertyName); } } private IServiceCostingSheetServiceProxy _service; public RelayCommand SaveCommand { get; private set; } public MainViewModel(IServiceCostingSheetServiceProxy service) { this.ServiceCostingSheets = new ObservableCollection<ServiceCostingSheetViewModel>(); this.CostingSheetPricingOptions = new List<CostingSheetPricingOptionsViewModel>(); _service = service; _service.GetServiceCostingSheet(OnGetServiceCostingSheetCompleted); _service.GetCostingSheetPricingOptions(OnGetCostingSheetPricingOptionsCompleted); //SaveCommand = new RelayCommand(SaveCustomers); } private void OnGetServiceCostingSheetCompleted(IEnumerable<DMCpro.Web.App.Model.ServiceCostingSheet> result, Exception ex) { this.ServiceCostingSheets.Clear(); if (ex != null) { ErrorMessage = ex.Message; return; } if (result == null) return; foreach (var i in result) this.ServiceCostingSheets.Add(new ServiceCostingSheetViewModel(i)); } private void OnGetCostingSheetPricingOptionsCompleted(IEnumerable<DMCpro.Web.App.Model.CostingSheetPricingOptions> result, Exception ex) { if (ex != null) { ErrorMessage = ex.Message; return; } if (result == null) return; foreach (var i in result) this.CostingSheetPricingOptions.Add(new CostingSheetPricingOptionsViewModel(i)); } }}VIEWMODEL - ViewModel for GridView control
using System;using System.Windows;using DMCpro.Silverlight.MvvmHelpers;using DMCpro.Web.App.Model;namespace DMCpro.Silverlight.ServiceCostingSheet.ViewModel{ public class ServiceCostingSheetViewModel : ViewModelBase { public DMCpro.Web.App.Model.ServiceCostingSheet Model { get; private set; } /// <summary> /// The <see cref="DirtyVisibility" /> property's name. /// </summary> public const string DirtyVisibilityPropertyName = "DirtyVisibility"; private Visibility _dirty = Visibility.Collapsed; /// <summary> /// Gets the DirtyVisibility property. /// Changes to that property's value raise the PropertyChanged event. /// </summary> public Visibility DirtyVisibility { get { return _dirty; } set { if (_dirty == value) return; _dirty = value; RaisePropertyChanged(DirtyVisibilityPropertyName); } } public ServiceCostingSheetViewModel(DMCpro.Web.App.Model.ServiceCostingSheet model) { Model = model; model.PropertyChanged += (s, e) => { DirtyVisibility = Visibility.Visible; }; } }}VIEWMODEL - GridView Edit mode RadComboBox
using System;using System.Windows;using DMCpro.Silverlight.MvvmHelpers;using DMCpro.Web.App.Model;namespace DMCpro.Silverlight.CostingSheetPricingOptions.ViewModel{ public class CostingSheetPricingOptionsViewModel : ViewModelBase { public DMCpro.Web.App.Model.CostingSheetPricingOptions Model { get; private set; } /// <summary> /// The <see cref="DirtyVisibility" /> property's name. /// </summary> public const string DirtyVisibilityPropertyName = "DirtyVisibility"; private Visibility _dirty = Visibility.Collapsed; /// <summary> /// Gets the DirtyVisibility property. /// Changes to that property's value raise the PropertyChanged event. /// </summary> public Visibility DirtyVisibility { get { return _dirty; } set { if (_dirty == value) return; _dirty = value; RaisePropertyChanged(DirtyVisibilityPropertyName); } } public CostingSheetPricingOptionsViewModel(DMCpro.Web.App.Model.CostingSheetPricingOptions model) { Model = model; model.PropertyChanged += (s, e) => { DirtyVisibility = Visibility.Visible; }; } }}MODEL - Proxy
using System;using System.Collections.Generic;using model = DMCpro.Web.App.Model;using DMCpro.Web.App.Services;using System.ServiceModel.DomainServices.Client;namespace DMCpro.Silverlight.ServiceCostingSheet.Model{ public class ServiceCostingSheetServiceProxy : IServiceCostingSheetServiceProxy { private CostingSheetDomainContext _context; private int _lineNumber; private string _status; public ServiceCostingSheetServiceProxy(int lineNumber, string status) { _lineNumber = lineNumber; _status = status; } public void GetServiceCostingSheet(Action<IEnumerable<model.ServiceCostingSheet>, Exception> callback) { this.EnsureContext(); _context.Load ( _context.GetServiceCostingSheetQuery(_lineNumber,_status), (e) => { callback(!e.HasError ? e.Entities : null, e.HasError ? e.Error : null); }, null ); } public void GetCostingSheetPricingOptions(Action<IEnumerable<model.CostingSheetPricingOptions>, Exception> callback) { this.EnsureContext(); _context.Load ( _context.GetCostingSheetPricingOptionsQuery(), (e) => { callback(!e.HasError ? e.Entities : null, e.HasError ? e.Error : null); }, null ); } public void GetCostingSheetBillTypes(Action<IEnumerable<model.CostingSheetBillTypes>, Exception> callback) { this.EnsureContext(); _context.Load ( _context.GetCostingSheetBillTypesQuery(), (e) => { callback(!e.HasError ? e.Entities : null, e.HasError ? e.Error : null); }, null ); } public void GetCostingSheetCommissionOptions(Action<IEnumerable<model.CostingSheetCommissionOptions>, Exception> callback) { this.EnsureContext(); _context.Load ( _context.GetCostingSheetCommissionOptionsQuery(), (e) => { callback(!e.HasError ? e.Entities : null, e.HasError ? e.Error : null); }, null ); } private void EnsureContext() { if (_context == null) _context = new CostingSheetDomainContext(); } }}MODEL - Interface for Proxy
using System;using System.Collections.Generic;using DMCpro.Web.App.Model;namespace DMCpro.Silverlight.ServiceCostingSheet.Model{ public interface IServiceCostingSheetServiceProxy { void GetServiceCostingSheet(Action<IEnumerable<DMCpro.Web.App.Model.ServiceCostingSheet>, Exception> callback); void GetCostingSheetPricingOptions(Action<IEnumerable<DMCpro.Web.App.Model.CostingSheetPricingOptions>, Exception> callback); void GetCostingSheetBillTypes(Action<IEnumerable<DMCpro.Web.App.Model.CostingSheetBillTypes>, Exception> callback); void GetCostingSheetCommissionOptions(Action<IEnumerable<DMCpro.Web.App.Model.CostingSheetCommissionOptions>, Exception> callback); }}MainPage - Code Behind
using System;using System.Windows;using System.Windows.Controls;using System.Windows.Browser;namespace DMCpro.Silverlight.ServiceCostingSheet{ public partial class MainPage : UserControl { public MainPage() { // set global telerik theme Telerik.Windows.Controls.StyleManager.ApplicationTheme = new Telerik.Windows.Controls.Office_SilverTheme(); // Required to initialize variables InitializeComponent(); // add event handles to keep the MainPage and HTML silverlightHostControl height in sync with its children this.LayoutRoot.SizeChanged += (s, e) => { this.Height = e.NewSize.Height; }; this.SizeChanged += (s, e) => { HtmlPage.Document.GetElementById("silverlightControlHost").SetStyleAttribute("height", this.Height.ToString() + "px"); }; } }}MainPage.XAML
<UserControl x:Class="DMCpro.Silverlight.ServiceCostingSheet.MainPage" mc:Ignorable="d" xmlns:view="clr-namespace:DMCpro.Silverlight.ServiceCostingSheet.View"> <Grid x:Name="LayoutRoot"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <view:ServiceCostingSheetView Height="Auto" /> </Grid></UserControl>0
Jerry T.
Top achievements
Rank 1
answered on 05 Jul 2011, 03:38 PM
Ah...and using this for the MvvmHelpers:
// ****************************************************************************// <copyright file="ViewModelBase.cs" company="GalaSoft Laurent Bugnion">// Copyright © GalaSoft Laurent Bugnion 2009// </copyright>// ****************************************************************************// <author>Laurent Bugnion</author>// <email>laurent@galasoft.ch</email>// <date>22.4.2009</date>// <project>GalaSoft.MvvmLight</project>// <web>http://www.galasoft.ch<;/web>// <license>// See license.txt in this project or http://www.galasoft.ch/license_MIT.txt// </license>// <LastBaseLevel>BL0008</LastBaseLevel>// ****************************************************************************using System;using System.ComponentModel;using System.Diagnostics;using System.Diagnostics.CodeAnalysis;namespace DMCpro.Silverlight.MvvmHelpers{ /// <summary> /// A base class for the ViewModel classes in the MVVM pattern. /// <para>The IDisposable implementation of this class is obsolete, and /// should not be used anymore. It will be removed in a future version. /// </para> /// </summary> public abstract class ViewModelBase : INotifyPropertyChanged { /// <summary> /// Occurs when a property value changes. /// </summary> public event PropertyChangedEventHandler PropertyChanged; /// <summary> /// Raises the PropertyChanged event if needed. /// </summary> /// <param name="propertyName">The name of the property that /// changed.</param> [SuppressMessage("Microsoft.Design", "CA1030:UseEventsWhereAppropriate", Justification = "This cannot be an event")] protected virtual void RaisePropertyChanged(string propertyName) { VerifyPropertyName(propertyName); var handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } [SuppressMessage("Microsoft.Design", "CA1030:UseEventsWhereAppropriate", Justification = "This cannot be an event")] protected void RaisePropertyChanged(PropertyChangedEventArgs args) { if (PropertyChanged != null) { PropertyChanged(this, args); } } /// <summary> /// Verifies that a property name exists in this ViewModel. This method /// can be called before the property is used, for instance before /// calling RaisePropertyChanged. It avoids errors when a property name /// is changed but some places are missed. /// <para>This method is only active in DEBUG mode.</para> /// </summary> /// <param name="propertyName"></param> [Conditional("DEBUG")] [DebuggerStepThrough] public void VerifyPropertyName(string propertyName) { var myType = this.GetType(); if (myType.GetProperty(propertyName) == null) { throw new ArgumentException("Property not found", propertyName); } } }}