Inheritance: System.MarshalByRefObject
        public CategoryViewModel(Category category)
            : base(Consts.KEY_NAME, category.Name)
        {
            _category = category;

            _nameProperty = new WProperty(typeof(string), category.Name);
            _descriptionProperty = new WProperty(typeof(string), category.Description);
            _thumbProperty = new WProperty(typeof(string), null);
            _estimatedChildrenProperty = new WProperty(typeof(uint?), CalculateChildrenCount());

            if (Category is NextPageCategory)
            {
                Thumb = "NextPage.png";
            }
            else
            {
                _eventDelegator = OnlineVideosAppDomain.Domain.CreateInstanceAndUnwrap(typeof(PropertyChangedDelegator).Assembly.FullName, typeof(PropertyChangedDelegator).FullName) as PropertyChangedDelegator;
                _eventDelegator.InvokeTarget = new PropertyChangedExecutor
                {
                    InvokeHandler = (s, e) =>
                    {
                        if (e.PropertyName == "ThumbnailImage") Thumb = (s as Category).ThumbnailImage;
                    }
                };
                _category.PropertyChanged += _eventDelegator.EventDelegate;
            }
        }
        public Category(OnlineVideos.Category category)
        {
            Model = category;

            Name = category.Name;
            Description = category.Description;
            ThumbnailImage = category.ThumbnailImage;
            CategoryPath = category.RecursiveName();
            if (category is OnlineVideos.RssLink) EstimatedVideoCount = (category as OnlineVideos.RssLink).EstimatedVideoCount;

            // we cannot attach directly to the PropertyChanged event of the Model as it is in another domain and PropertyChangedEventArgs is not serializable
            eventDelegator = OnlineVideosAppDomain.Domain.CreateInstanceAndUnwrap(typeof(PropertyChangedDelegator).Assembly.FullName, typeof(PropertyChangedDelegator).FullName) as PropertyChangedDelegator;
            eventDelegator.InvokeTarget = new PropertyChangedExecutor() { InvokeHandler = ModelPropertyChanged };
            Model.PropertyChanged += eventDelegator.EventDelegate;
        }
        public VideoViewModel(VideoInfo videoInfo, Category category, string siteName, string utilName, bool isDetailsVideo)
            : base(Consts.KEY_NAME, isDetailsVideo ? ((DetailVideoInfo)videoInfo).Title2 : videoInfo.Title)
        {
            VideoInfo = videoInfo;
			Category = category;
			SiteName = siteName;
			SiteUtilName = utilName;
			IsDetailsVideo = isDetailsVideo;

            _titleProperty = new WProperty(typeof(string), videoInfo.Title);
            _title2Property = new WProperty(typeof(string), isDetailsVideo ? ((DetailVideoInfo)videoInfo).Title2 : string.Empty);
            _descriptionProperty = new WProperty(typeof(string), videoInfo.Description);
            _lengthProperty = new WProperty(typeof(string), videoInfo.Length);
			_airdateProperty = new WProperty(typeof(string), videoInfo.Airdate);
            _thumbnailImageProperty = new WProperty(typeof(string), videoInfo.ThumbnailImage);

			_contextMenuEntriesProperty = new WProperty(typeof(ItemsList), null);

			eventDelegator = OnlineVideosAppDomain.Domain.CreateInstanceAndUnwrap(typeof(PropertyChangedDelegator).Assembly.FullName, typeof(PropertyChangedDelegator).FullName) as PropertyChangedDelegator;
			eventDelegator.InvokeTarget = new PropertyChangedExecutor()
			{
				InvokeHandler = (s, e) =>
				{
					if (e.PropertyName == "ThumbnailImage") ThumbnailImage = (s as VideoInfo).ThumbnailImage;
					else if (e.PropertyName == "Length") Length = (s as VideoInfo).Length;
				}
			};
			VideoInfo.PropertyChanged += eventDelegator.EventDelegate;
        }